web自动化之常见元素操作

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

   🌟(2)move_to_element(元素对象) -> 悬浮  

  (3)context_click() -> 右键

  (4)double_click() -> 双击

  (5)click_and_hold() -> 左键点击并保持

  (6)release() -> 释放

  (7)drag_and_drop() -> 拖拽    是由两个内部方法实现的( click_and_hold() + release() )

  (8)pause() -> 暂停

===> 2⃣️ 执行动作链中的动作

    ac.perform()

4、下拉列表操作

1)select类型的下拉列表:即由select、option标签实现的下拉列表

==> selenium提供了专门的类来处理这种类型的下拉列表,Select类初始化时须提供参数select元素对象

==> Select类提供了三种方式选择选项:

  => (1)value属性

  => (2)下标,从0开始

  => (3)文本

使用步骤:

===> 1⃣️ 初始化一个select对象:select = Select(driver.find_element_by_xxx(select标签的定位表达式))

===> 2⃣️ 选择下拉列表选项:

  (1)select.select_by_value(“选项的value值”)

  (2)select.select_by_index(选项的下标)

  (3)select.select_visible_text(“选项的文本内容”) 

2)非select类型的下拉列表:该怎么做怎么做,如下:

==> 1)触发下拉列表出现  --> 点击/悬浮

==> 2)  等待要操作的元素可见  

==> 3)选择要操作的元素  --> 点击

 

5、键盘操作

===> 通过send_keys()方法+Keys类实现,send_keys()方法可以接收多个参数

示例:

1)输入内容后,点击enter:

driver.find_element_by_xxx().send_keys(“xxxx”, Keys.ENTER)

2)实现ctrl+c

driver.find_element_by_xxx().send_keys(Keys.CONTROL, “c”)

3)实现翻页:

driver.find_element_by_xxx().send_keys(Keys.PAGE_DOWN)

 

6、js操作

selenium提供了执行js代码的方法:execute_script(参数1, 参数2, 参数3…)  

==> 参数1:js语句,语句中用arguments[下标]来接收外部传参 即参数2/参数3…

==> 参数2/参数3…:js语句所需参数

应用:

1)通过js操作滚动条:

1⃣️ 元素存在于页面,但不可见于页面,需要滚动到可视区域之后才能操作

ele = driver.find_element_by_xxx()

driver.execute_script(“arguments[0].scrollIntoView(false)”, ele)

注:scrollIntoView()默认与页面顶部对其,false表示与页面底部对其

2⃣️ 页面级别的滚动条,直接滚动到页面底部/顶部

driver.execute_script(“window.scrollTo(0, document.body.scrollHeight)”)

driver.execute_script(“window.scrollTo(document.body.scrollHeight, 0)”)

2)通过js操作日期框:通过js修改元素的属性

 

注意:针对不能直接输入的输入框,如果能输入,直接通过send_keys()输入即可

==> 不能输入的输入框,修改readOnly属性为false

var ele = document.getElementByXX();

ele.readOnly = false;

ele.value = '';

 

7、上传操作

1)输入框类型的文件上传:

==> 通过send_keys(本地文件路径)即可

 

2)点击上传后调出了windows框的文件上传:

==> 处理windows控件的三方工具:

1)autoitv3  === 三方软件,需要下载安装,有自己的格式,需要写脚本,需要转换为python可执行的 文件

2)SendKeys  === 三方库,2003年,太老版本,不一定支持python3.7

3)pywin32  === 主要使用,只处理windows控件。引入win32gui和win32con

4)pyautowin  === 对chrome driver有要求,不一定兼容

==> windows控件识别工具WinSpy辅助查看并定位控件元素

注:具体方法参考百度...此处不做详解...

 

posted @ 2020-08-07 15:36  潘潘达  阅读(810)  评论(0编辑  收藏  举报