Selenium自动化测试第二天(下)
如有任何学习问题,可以添加作者微信:superz-han
目录
动作链 模拟鼠标操作
- 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()
练习
打开百度->设置->高级搜索->输入龙腾育才->搜索
注意
- 不要忘记使用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()
练习
打开百度
- 输入龙腾育才
- 退格2次
- 全选 复制 粘贴
截图
一般用例出错或失败时要截图
- 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()
注意
- 只支持png格式
等待
- 强制等待 time.sleep(5)
- 隐性等待(智能等待) driver.implicitly_wait(10) 10s超时 所有元素定位不到都会等待
- 显性等待(高级用法)
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可以修改网页
- 隐藏元素
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");
)
- 不可输入/点击(移除readonly/disable属性)
- 拖动滚动条(流加载页面) document.documentElement.scrollTop=10000;
- 富文本框
- 更改元素样式
js2 = '''
var q = document.getElementById("buttonID");
q.value="hello";
q.style.backgroundColor="red";
'''
driver.execute_script(js2)
- 为一些不好定位的元素添加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
- 在"哈哈你输入不了"的输入框清空并输入"js开挂" (移除readonly属性)
- 点击"不可点击"按钮(移除disable属性)
- 为"第一个div"同级的table标签添加id="table1"
日期控件
1.逐个点击
2.用js修改为可输入,输入时间
练习
http://115.28.108.130/date.html
修改为可输入,并输入时间
上传下载
- 上传直接输入(不能输入用js修改), 下载直接点击
- 借助其他工具
练习
打开http://115.28.108.130/control.html, 上传文件
selenium宇宙之外
比如弹出上传下载windows对话框, flash操作, 保存网页
- 使用Autoit3/按键精灵编写脚本->生成exe->python执行exe
- 使用win32/win32gui操作windows窗口
常见错误怎么处理
- 看报什么错 1. 元素定位不到 2. 元素不可见
- 看有没有frame/iframe
- 操作前 sleep()
- 看看元素或者上级/上上级元素是否不可及
此为北京龙腾育才 Python高级自动化(Selenium部分)授课笔记
课程介绍
想要参加现场(北京)/网络课程的可以联系作者微信:lockingfree
- 高效学习,快速掌握Python自动化所有领域技能
- 同步快速解决各种问题
- 配套实战项目练习