首页 > 技术文章 > web自动化之常见元素操作

panpanda 2020-08-07 15:36 原文

前言:使用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方法类似,一般不用鼠标操作来实现点击

   

推荐阅读