如有任何学习问题,可以添加作者微信:lockingfree

目录

动作链 模拟鼠标操作

  • click(): 单击
  • double_click(): 双击
  • context_click(): 右击
  • move_to_element(a): 移动到元素a
  • drag_and_drop(a,b): 拖放,将a拖动到b元素位置
  • click_and_hold(): 单击并按住鼠标左键 release(): 松开鼠标
from selenium.webdriver.common.action_chains import ActionChains
...
menu = driver.find_element_by_xpath("//input[@value='下拉菜单']")
ActionChains(driver).move_to_element(menu).perform()

示例

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
sleep(1)
# driver.find_element_by_link_text("baidu").click() # 找不到该元素
dropdown = driver.find_element_by_xpath("//input[@value='下拉菜单']") ActionChains(driver).move_to_element(dropdown).perform() # 记得使用perform()执行 driver.find_element_by_link_text("baidu").click() sleep(5)
driver.quit()

练习

打开百度->设置->高级搜索->输入龙腾育才->搜索

注意

  1. 不要忘记使用perform()执行操作

Keys模拟键盘

from selenium.webdriver.common.keys import Keys
....
input = driver.find_element_by_id("kw")
input.send_keys("龙腾育才")
input.send_keys(Keys.ENTER)

示例

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
input = driver.find_element_by_id("kw")
# 注意不要使用 input = driver.find_element_by_id("kw").send_keys("龙腾育才")
input.send_keys("龙腾育才")
input.send_keys(Keys.ENTER) sleep(5)
driver.quit()

练习

打开百度

  1. 输入龙腾育才
  2. 退格2次
  3. 全选 复制 粘贴

截图

一般用例出错或失败时要截图

  1. save_snapshot(path) get_snapshot_as_file(path) # path是保存的图片路径

示例

from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.set_window_size(800,600)
driver.get("http://www.baidu.com")
driver.save_screenshot("d:/1.png") # 只支持png格式 等同于 driver.get_screenshot_as_file("d:/2.png") sleep(5)
driver.quit()

注意

  1. 只支持png格式

等待

  1. 强制等待 time.sleep(5)
  2. 隐性等待(智能等待) driver.implicitly_wait(10) 10s超时 所有元素定位不到都会等待
  3. 显性等待(高级用法)

    wait = WebDriverWait(driver,20)

    wait.until(lambda driver: driver.find_element_by_id("...").click())

    每隔一定时间查找并单击元素,直到找到

使用定位器定位

find_element(*location) By.ID, "kw"

from selenium.webdriver.common.by import By
find_element(By.ID, "") find_element_by_id("")
find_element(By.NAME, "") find_element_by_name("")
find_element(By.CLASS_NAME, "") find_element_by_class_name("")
find_element(By.LINK_TEXT, "") find_element_by_link_text("")
find_element(By.PARTIAL_LINK_TEXT, "") find_element_by_partial_link_text("")
find_element(By.PATH, "") find_element_by_partial_xpath("")
find_element(By.PARTIAL_CSS_SELECTOR, "") find_element_by_css_selector("")
  • ID = "id"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • NAME = "name"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"

使用期望条件(except_conditions)

  • presence_of_element_located((By.XPATH,"")): 直到元素出现并能定位到
view = wait.until(EC.presence_of_element_located((By.XPATH,'//td[text()="王五"]/../td[4]/a')))
view.click()

示例

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
# driver.implicitly_wait(10) wait = WebDriverWait(driver, 20) # 等待元素出现并操作元素
# wait.until(lambda driver: driver.find_element(By.XPATH, '//*[text()="王五"]/following::td[3]/a').click()) # 相当于 等待出现 再 操作元素 注意 presence_of_element_located((By.ID, "")) 里面传一个元祖参数
lookup = wait.until(EC.presence_of_element_located((By.XPATH, '//*[text()="王五"]/following::td[3]/a')))
lookup.click() sleep(5)
driver.quit()

开挂的js

使用js可以修改网页

  1. 隐藏元素

    selenium默认定位不到隐藏元素
selenium.common.exceptions.ElementNotVisibleException:
Message: element not visible

hide

hidden

hidden="hidden"

style="display: none"

1. 按手工逻辑操作使其显示再定位

2. 使用js强制改成显示再定位

# 移除相应属性
driver.execute_script(
document.querySelector("#hd1").removeAttribute("hidden");
)
  1. 不可输入/点击(移除readonly/disable属性)
  2. 拖动滚动条(流加载页面) document.documentElement.scrollTop=10000;
  3. 富文本框
  4. 更改元素样式
js2 = '''
var q = document.getElementById("buttonID");
q.value="hello";
q.style.backgroundColor="red";
'''
driver.execute_script(js2)
  1. 为一些不好定位的元素添加id
js4='''
'''
q = document.querySelector("#firstdiv>form>table");
q.id = "table1";

示例

from selenium import webdriver
from time import sleep driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html") # # 1. 滚动页面 document.documentElement.scrollTop=1000
# # driver.find_element_by_link_text("友情链接").click() # 不需要滚动页面页可以定位到下面的元素(只要加载了)
# # driver.back()
# js = 'document.documentElement.scrollTop=1000;' # DTD网页 否则使用docment.body.scrollTop=1000; 滚动到居上1000像素处
# driver.execute_script(js) # 可用于处理流页面
#
# sleep(3)
# # 2. 更改元素样式 使用 document.getElementById() 得到DOM对象
# js = '''
# document.documentElement.scrollTop=0;
# var q = document.getElementById("buttonID");
# q.style.backgroundColor="red";
#
# '''
# driver.execute_script(js)
#
# sleep(3)
# # 3. 移除readonly/disable/hidden/属性 使用jquery定位 $(#id) 和getElementById("")得到的DOM对象不同 两者拥有不同的方法
# js = "document.querySelector('#ro').removeAttribute('readonly')"
# # js = "$('#ro').removeAttribute('readonly')"
# driver.execute_script(js)
# ro = driver.find_element_by_id("ro")
# ro.clear()
# ro.send_keys("成功输入")
#
# # 或直接使用js修改value
# js = 'document.querySelector("#ro").value="成功输入"'
# driver.execute_script(js) # 4. 富文本框输入 driver.get("http://www.vemmis.com/bjq/index.html") # js操作iframe 先获取iframe里面的window对象,再通过这个对象,获取到里面的DOM元素
js = '''
iframe = document.getElementById('ueditor_0');
iframe.contentWindow.document.body.innerHTML="hello";
'''
driver.execute_script(js) sleep(5)
driver.quit()

练习

打开http://115.28.108.130/control.html

  1. 在"哈哈你输入不了"的输入框清空并输入"js开挂" (移除readonly属性)
  2. 点击"不可点击"按钮(移除disable属性)
  3. 为"第一个div"同级的table标签添加id="table1"

日期控件

1.逐个点击

2.用js修改为可输入,输入时间

练习

http://115.28.108.130/date.html

修改为可输入,并输入时间

上传下载

  1. 上传直接输入(不能输入用js修改), 下载直接点击
  2. 借助其他工具

练习

打开http://115.28.108.130/control.html, 上传文件

selenium宇宙之外

比如弹出上传下载windows对话框, flash操作, 保存网页

  1. 使用Autoit3/按键精灵编写脚本->生成exe->python执行exe
  2. 使用win32/win32gui操作windows窗口

常见错误怎么处理

  1. 看报什么错 1. 元素定位不到 2. 元素不可见
  2. 看有没有frame/iframe
  3. 操作前 sleep()
  4. 看看元素或者上级/上上级元素是否不可及

此为北京龙腾育才 Python高级自动化(Selenium部分)授课笔记

课程介绍

想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree

  1. 高效学习,快速掌握Python自动化所有领域技能
  2. 同步快速解决各种问题
  3. 配套实战项目练习

Selenium自动化测试第二天(下)的更多相关文章

  1. Selenium自动化测试第二天(上)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  2. Selenium自动化测试第一天(下)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  3. Selenium自动化测试第一天(上)

    如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...

  4. 《手把手教你》系列基础篇之(二)-java+ selenium自动化测试-环境搭建(下)基于Maven(详细教程)

    1.简介 Apache Maven是一个软件项目管理和综合工具.基于项目对象模型(POM)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件.由于现在企业和公司中Java的大部分项目都是基 ...

  5. 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...

  6. 《Selenium自动化测试实战》新书上市,有需要朋友们可以了解下,欢迎大家多提宝贵意见

    京东:https://item.jd.com/13123910.html当当:http://product.dangdang.com/29204520.html 1. 本书基于 Python 3.8 ...

  7. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  8. Selenium自动化测试框架入门整理

    ​​关注嘉为科技,获取运维新知 本文主要针对Selenium自动化测试框架入门整理,只涉及总体功能及框架要点介绍说明,以及使用前提技术基础要求整理说明.作为开发人员.测试人员入门参考. 本文参考:Se ...

  9. 《手把手教你》系列技巧篇(十五)-java+ selenium自动化测试-元素定位大法之By xpath中卷(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath.xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. ...

随机推荐

  1. 2019.1.7 Mac的Vscode插件总结

    Vscode插件 通用插件 Chinese 配置中文界面 HTML Snippets H5代码片段以及提示 HTML CSS Support 让 html 标签上写class 智能提示当前项目所支持的 ...

  2. Kali-linux应用更新和配置额外安全工具

    本节将介绍更新Kali的过程和配置一些额外的工具.这些工具在后面的章节中将是有用的.Kali软件包不断地更新和发布之间,用户很快发现一套新的工具比最初在DVD ROM上下载的软件包更有用.本节将通过更 ...

  3. Relay GraphQL理解

    Relay是构建数据驱动 React 应用的js框架. Relay:特性一.声明式:不再使用一个命令式API与数据存储通讯.而是简单的使用RraphQL声明组件数据需求,让Relay理解如何及什么时候 ...

  4. Lua中的数据结构

    1 数组:(lua习惯数组从1开始) a={} , do a[i]= end 2 阵和多维数组 : mt={}//新建一个表,表元素为表 ,N do mt[i]={}//新建一个表,里面的表元素为值 ...

  5. Vertical-Align你应该知道的一切

    好,我们聊聊vertical-align.这个属性主要目的用于将相邻的文本与元素对齐.而实际上,verticle-algin可以在不同上下文中灵活地对齐元素,以及进行细粒度的控制,不必知道元素的大小. ...

  6. 如何理解低耦合AND高内聚?[转]

    1.高内聚 首先我们来看看内聚的含义:软件含义上的内聚其实是从化学中的分子的内聚演变过来的,化学中的分子间的作用力,作用力强则表现为内聚程度高.在软件中内聚程度的高低,标识着软件设计的好坏. 我们在进 ...

  7. Struts2+hibernate 结合,实现登陆校验

    完整的项目在github中,数据库使用postgresql,建表语句见项目文档. 下面我分块介绍一下struts2.hibernate.与页面部分的代码. Struts2 UserAction.jav ...

  8. python基础 列表和字符串

    1.列表和字符串最大区别就是 列表可以改变,字符串不可以改变 列表: welldone = [ "hutu","python","java" ...

  9. sqlplus常用的几种登录方式

    1. sqlplus / as sysdba 操作系统认证,sys管理员登录,/后面要有空格. 2. sqlplus "/ as sysdba" 操作系统认证,sys管理员登录,/ ...

  10. AtomicStampedReference解决ABA问题

      在运用CAS做Lock-Free操作中有一个经典的ABA问题: 线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值 ...