Selenium自动化测试实战2-WebDriver高级运用
Selenium WebDriver 高级运用
selenium 等待机制
页面级等待机制:定义 Selenium 等待页面加载完毕的超时时间
使用此函数设置等待时间:driver.set_page_load_timeout(最长等待秒数)
元素级等待:常用于现代页面中的 ajax 请求返回整个过程的等待时间
- 强制等待:直接 time.sleep(3)强制睡眠
- 隐式等待:使用该代码设置宽限时间:
webdriver.implicitly_wait(等待秒数)
- 显式等待(最推荐使用):
WebDriverWait(WebDriver实例, 超时秒数, 检测时间间隔[可选], 可忽略异常集合[可选] )
脚本级等待机制:设置异步脚本超时时间
driver.set_script_timeout(最长等待秒数)
键鼠模拟
操作链中涉及的所有 WebElement 元素在操作链执行时必须同时存在,且处于可操作状态
ActionChains 操作链,使用流的形式依次处理模拟事件
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains # 记住导包driver = webdriver.Chrome()
driver.get("https://www.baidu.com")# ActionChains接收一个webdriver对象作为参数
# 链式调用的形式模拟点击
ActionChains(driver).click(driver.find_element(By.LINK_TEXT, "登录")).perform()
复杂操作链模拟:拖放操作
<html><head><style type="text/css">#div1 {width: 300px;height: 100px;padding: 10px;border: 1px solid #aaaaaa;}</style><script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script><script src="http://apps.bdimg.com/libs/jqueryui/1.10.4/jquery-ui.min.js"></script><script type="text/javascript">$(function () {$("#drag1").draggable();$("#div1").droppable({drop: function (event, ui) {alert("图片放置成功");},});});</script></head><body><p>请把图片拖放到方框中:</p><div id="div1"></div><br /><imgid="drag1"src="https://cdn.ptpress.cn/pubcloud/3/app/0718A6B0/cover/20191204BD
54009A.png"/></body>
</html>
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainsdriver = webdriver.Chrome()
driver.get("D:\\\\TestDragAndDrop.html")ActionChains(driver)\\.click_and_hold(driver.find_element(By.ID, "drag1"))\\.move_to_element(driver.find_element(By.ID, "div1"))\\.release()\\.perform()
组合键的实现,actionchains
精准控制组合键按下与弹起的动作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome()
driver.get("https://www.baidu.com")baiduSearchInput = driver.find_element(By.ID, "kw")
baiduSearchInput.send_keys("hello world")ActionChains(driver)\\.key_down(Keys.CONTROL)\\.send_keys("a")\\.key_up(Keys.CONTROL) \\.pause(3)\\.key_down(Keys.CONTROL) \\.send_keys("x") \\.key_up(Keys.CONTROL) \\.pause(3) \\.key_down(Keys.CONTROL) \\.send_keys("v") \\.key_up(Keys.CONTROL) \\.pause(3) \\.send_keys(Keys.BACKSPACE)\\.pause(3)\\.send_keys(Keys.ENTER)\\.perform()
操作 Cookie
获取 cookie 的两种方式:
driver.get_cookies() #获取所有的cookie对象集合
driver.get_cookie(cookie名称) #根据名称获取单个cookiedriver.add_cookie(cookie对象) # 增加cookie
driver.delete_all_cookies() #删除全部Cookie
driver.delete_cookie(cookie名称) #按名称删除指定Cookie
浏览器启动参数
浏览器实例时可以附加很多参数,这是所有参数的默认值
driver = webdriver.Chrome(executable_path='chromedriver', port=0, options=None,
service_args=None, desired_capabilities=None, service_log_path=None, chrome_options=
None, keep_alive=True)
JS 执行器进行深度操作
webdriver.execute_script("JavaScript脚本", 自定义参数集(可选)) #执行同步脚本
webdriver.execute_async_script("JavaScript脚本", 自定义参数集(可选)) #执行异步脚本
异步脚本中,JavaScript 是异步处理的,但是 Selenium 脚本是同步执行的
所以异步脚本必须存在一个 callback 回调函数,selenium 会时刻监测此回调函数,以实现异步 JS 平稳执行