前言:使用selenium做web UI自动化时,元素操作是最基本的,是用例的基础,所以在框架实战之前先好好学习常见元素操作吧~
一、常见元素操作有哪些?
1)三大等待
2)三大切换
3)下拉列表操作
4)鼠标操作
5)键盘操作
6)js操作
7)滚动条操作
8)日期框操作
9)文件上传操作
二、如何实现上述元素操作?
1、三大等待
1)为什么需要等待?
===> 当页面操作引起页面元素变化,如:肉眼可见的一些加载过程,代码在肉眼之前就已经“看见”,所以需要加载完成之后才能继续后续操作。
两个常用概念:
===> 1⃣️ 等待元素存在:查找元素之前,元素必须存在于DOM页面中
===> 2⃣️ 等待元素可见:操作元素之前,元素必须可见
2)什么情况下需要等待?
===> 页面操作引起页面变化,而要操作的元素是页面变化后的新元素,那么此时就需要等待新元素可见之后才能操作。
3)三大等待指的是什么?
===> 1⃣️ 强制等待:sleep
===> 2⃣️ 隐形等待:implicitly_wait()
===> 3⃣️ 显性等待:WebdriverWait + expected_condition
4)强制等待:sleep
===> 不管元素是否加载完成,也不管条件是否满足,都会等待所设置的时长。
===> 常在调试代码和辅助隐形等待/显性等待时使用。
示例:
import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
5)隐形等待:implicitly_wait()
===> 属于智能等待
===> 全局设置一次隐形等待,那么整个会话期间(打开浏览器到关闭浏览器的过程)全部应用。
===> 仅适用以下两种场景:
1⃣️ 等待元素存在,即等待DOM页面里有这个元素
2⃣️ 等待命令执行完成
===> 设置等待上限,时间上限范围内,元素什么时候存在了,就不等了,等待超时则抛出异常
代码实现:
driver.implicitly_wait(30)
一般放在启动浏览器会话后,即 driver=webdriver.Chrome() 后
import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 隐形等待 driver.implicitly_wait(30) driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
===> 弊端:只适用于两种场景,其他场景处理不了。如:等待元素可见、等待元素可用、等待新窗口出现、等待页面所有匹配的元素可见…
6)显性等待:WebdriverWait + expecte_conditions
===> 属于智能等待,等的是条件,即在时间上限范围内,等待某某条件成立时,就结束等待。
两要素:
===> 1⃣️ 等待 (带有时间上限和轮询周期,时间上限是必须值,轮询周期默认值为0.5) ==> WebdriverWait 类实现
用法:WebdriverWait(driver, 时间上限, 轮询周期).until(条件)
示例:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions driver = webdriver.Chrome() # 隐形等待 driver.implicitly_wait(30) driver.get("http://www.baidu.com") driver.find_element(By.ID, "kw").send_keys("selenium") driver.find_element(By.ID, "su").click() # 要等待的元素的定位策略 loc = (By.XPATH, "//a[text()='百度翻译']") # 显性等待 WebDriverWait(driver, 30).until(expected_conditions.visibility_of_element_located(loc)) driver.find_element(*loc).click() time.sleep(2) # 等待搜索后页面元素都加载完成 # 执行后续页面操作 driver.quit()
===> 2⃣️ 条件 --> expected_conditions模块提供
用法:expected_conditions.xxx条件(定位策略)
常见的显性等待条件:
元素可见:expected_conditions.visibility_of_element_located(元素定位策略)
元素存在:expected_conditions.presence_of_element_located(元素定位策略)
alert弹框存在:expected_conditions.alert_is_present(元素定位策略)
iframe可见并切换:expected_conditions.frame_to_be_available_and_switch_to_it(元素定位策略)
新的窗口打开:expected_conditions.new_window_is_opened(窗口句柄)
2、三大切换
1)窗口切换
注意⚠️ :窗口切换前是需要等待新窗口的出现的,有两种方式。
===> 1⃣️ 直接time.sleep()
===> 2⃣️ 通过ec模块的new_window_is_opened类来实现
两要素:
===> 1⃣️ (获取要切换的窗口的)窗口句柄,窗口句柄即窗口的ID,可以通过 driver.window_handles() 获取所有的窗口句柄,返回的是一个列表,列表的最后一个元素便是最新打开窗口的句柄。
===> 2⃣️ 切换,driver.switch_to.window(窗口句柄)
# 等待新窗口出现 time.sleep(2) # 1)获取当前所有窗口的句柄 wins = driver.window_handles() # 2) 切换至最新打开窗口 driver.switch_to.window(wins[-1])
2)iframe切换
1⃣️ iframe是什么?
===> 简而言之,iframe就是html中的html。
2⃣️ 什么情况下需要切换iframe?
===> 当要操作的元素在iframe中时,就需要切进iframe里,才能找到并操作该元素。
3⃣️ 怎么确定要操作的元素在iframe中?
===> 查看元素路径即可
4⃣️ 如何进行iframe切换?
===> 第一步:找到要切换的iframe
1)通过iframe的name属性
2)通过iframe的下标,从0开始
3)通过8大定位方式找到iframe并返回WebElement对象,即driver.find_element_by_xxx()
===> 第二步:切换
1)driver.switch_to.frame(“name属性值”)
2)driver.switch_to_frame(1) 下标,此处表示第二个iframe
3)driver.switch_to_frame(driver.find_element_by_xxx(“定位表达式”))
注意:切换完成后,可操作的范围是新的html,如果要继续操作主页面的html元素,则需要切回主页面,即driver.switch_to.default_content()
3)alert切换
===> js的三种弹框(不属于html页面元素):alert、confirm、prompt
1⃣️ 什么情况下需要切换?
===> 当某些页面操作触发js弹框出现时,如果不关闭掉,不能继续进行下一步页面操作,此时就需要切换至弹框,然后关闭弹框。
2⃣️ 如何进行alert切换?
===> 第一步:实例化一个alert对象
alt = driver.switch_to.alert
===> 第二步:操作alert弹框
1)关闭弹框(点击取消):alt.dismiss()
2) 关闭弹框(点击确定):alt.accept()
3) 获取弹框文本信息:alt.text
4) 输入文本:alt.send_keys(“文本内容”)
3、鼠标操作
注意⚠️ :能不使用鼠标操作就尽量不用,因为鼠标操作的稳定性不好。
===> 通过 ActionChains类 实现模拟鼠标操作
1)鼠标操作两要素:
===> 1⃣️ 将动作放置到动作链中:
ac = ActionChains()
ac.动作
==> 常见鼠标动作:
(1)click() -> 单击,与WebElement的click方法类似,一般不用鼠标操作来实现点击