首页 > 其他分享 >Selenium3自动化测试实战--第4章 WebDriver API 1

Selenium3自动化测试实战--第4章 WebDriver API 1

时间:2022-11-15 22:12:53浏览次数:37  
标签:WebDriver -- 元素 driver element Selenium3 选择器 find CSS

WebDriver API,用来操作浏览器元素的一些类和方法。

4.1 从定位元素开始

页面元素,都是由HTML代码组成,有层级,每个元素有不同的标签名和属性值。

WebDriver提供了8种元素定位方法:

  • from selenium.webdriver.common.by import By
  • find_element(By.ID,'')
  • find_element(By.NAME,'')
  • find_element(By.TAG_NAME,'')
  • find_element(By.CLASS_NAME,'')
  • find_element(By.LINK_TEXT,'')
  • find_element(By.PARTIAL_LINK_TEXT,'')
  • find_element(By.XPATH,'')
  • find_element(By.CSS_SELECTOR,'')

HTML结构有如下特征:

1 它们由标签对组成

2 标签有各种属性

3 标签对之间可以有文本数据

4 标签有层级关系

4.1.1 ID定位,有唯一性

4.1.2 NAME定位。不唯一

4.1.3 CLASS_NAME。

4.1.4 TAG_NAME。 <input> 定义输入框。<a> 超链接

4.1.5 LINK_TEXT。

4.1.6 PARTIAL_LINK_TEXT

4.1.7 XPATH

  1 绝对路径定位  /html/body/.....div[2]

  2 利用元素属性定位 

"//input[@id='kw'] "       查找id属性为kw的input标签的

"//*[@name='username']"       查找name属性为username的所有标签

"//input[@name='username']"      查找属性name='username'的input标签

  3 层级与属性结合

"//form[input/@name='username']"    form标签下的Input子标签,属性name='username'

"//form[@id='loginForm']/input[1]"     属性id为loginForm的form标签下的第1个input

  4 使用逻辑运算符

"//input[@id='kw' and @class='s_ipt']"   and 满足2个属性条件

"//input[@name='continue'][@type='button']"   # 这是selenium官网的写法

  5 使用contains方法

"//span[contains(@class,'s_ipt')]/input"

  6 使用text()方法

"//a[text()='高风险区外溢人员不再集中隔离']"

这条,文中书写是错误的,写的是 //a[text(),'高风险区外溢人员不再集中隔离'],将等号写成了逗号,是会报定位元素失败的错误的。

总结下来方法有,绝对路径,相对路径,元素索引,元素属性,元素属性值,元素文本

4.1.8 CSS定位

CSS是一种语言,用来描述HTML和XML文档的表现。CSS使用选择器为页面元素绑定属性。一般情况下,CSS比XPATH定位速度快。

CSS选择器的常见语法

选择器   例子   描述
.class   .intro   class选择器,选择class="intro"的所有元素
#id   #firstname   id选择器
*   *   所有元素
element     p   选择所有<p>元素
element:nth-child()   element:nth-child(2)   第2个element元素
element>element   div>input   选择父元素为<div>的所有<input>元素
element+element   div+input   选择同一级中紧接在<div>元素之后的所有<input>元素
[attribute='value']   [target='_blank']   选择target='_blank'的所有元素 这里书中错误,例子中value没有加引号
[attribute*='value']   [title*='s_ipt_wr']   属性包含xxx的元素
[attribute^='value']   [title^='s_ipt_wr']   属性以xxx开头的元素
[attribute$='value']   [title$='s_ipt_wr']   属性以xxx结尾的元素

总结下来,就是绝对路径,相对路径,元素属性,元素属性值,查询子元素,查询兄弟元素

不论是xpath ,还是 CSS, 表示第几个元素时,是从1开始的,这点与列表等,不要混淆。

xpath是元素名称后面 方括号[]里面写数字;

CSS是元素名称 :nth-child(1)

最快捷的办法,选中页面控件,右击,选择检查, 打开 开发者模式后,直接定位到相应元素,然后再右键,复制,选择CSS选择器,或者XPATH路径。

driver.find_element(By.CSS_SELECTOR,".opr-toplist1-table_3K7iH > div:nth-child(1) > div:nth-child(2) > div:nth-child(1) > a:nth-child(2)").click()

driver.find_element(By.CSS_SELECTOR,"a[title='1例阳性全域管控?黑龙江铁力:有3例']").click()

driver.find_element(By.CSS_SELECTOR,"[title*='取消区域全员核酸']").click()

CSS选择器更多的用法,可以查看w3cschool网站的CSS选择器参考手册 www.w3school.com.cn/cssref/css_selectors.asp

[attribute|=value] 选择器限制value后不能有除-之外的其他字符,[attribute^=value] 无限制

 

除了上面的,书中的介绍,官网另提供了根据DOM定位元素的方法,但DOM定位应该是只支持JavaScript语言

   <html>
    <body>
     <form id="loginForm">
      <input name="username" type="text" />
      <input name="password" type="password" />
      <input name="continue" type="submit" value="Login" />
      <input name="continue" type="button" value="Clear" />
     </form>
   </body>
   <html>

  • dom=document.getElementById('loginForm') (3)
  • dom=document.forms['loginForm'] (3)
  • dom=document.forms[0] (3)
  • document.forms[0].username (4)
  • document.forms[0].elements['username'] (4)
  • document.forms[0].elements[0] (4)
  • document.forms[0].elements[3] (7)

 

按官网文档所说,何时使用哪些定位器以及如何在代码中最好地管理它们

一般来说,如果HTML的id是可用的,唯一的且是可预测的,那么它就是在页面上定位元素的首选方法。它们的工作速度非常快,可以避免复杂的DOM遍历带来的大量处理。

如果没有唯一的id,那么最好使用写得好的CSS选择器来查找元素。Xpath和CSS选择器一样好用,但是它语法很复杂,并且经常很难高度。尽量XPath选择器非常灵活,但是他们通常未经过浏览器厂商的性能测试,并且运行速度很慢。

基于链接文本和部分链接文本的选择策略有其缺点,即只能对链接元素起作用。此外,他们在webdriver内部调用querySelectorAll选择器。

标签名可能是一种危险的定位元素的方法。页面上经常出现同一标签的多个元素。这在调用findElements(By)方法返回元素集合的时候非常有用。

建议尽可能保持定位器的紧凑性和可读性。使用webdriver遍历DOM结构是一项性能花销很大的操作,搜索范围越小越好。

4.2 控制浏览器

4.2.1 控制浏览器窗口大小

driver.set_window_size(480,800)

driver.maximize_window()

4.2.2 控制浏览器后退,前进

driver.back()

driver.forward()

4.2.3 模拟浏览器刷新

driver.refresh()

4.3 WebDriver中的常用方法

driver.find_element(By.ID,'kw').clear()

driver.find_element(By.ID,'kw').send_keys('selenium')

driver.find_element(By.ID,'kw').click()

driver.find_element(By.ID,'kw').submit()  # 没有按钮,通过回车完成的

driver.find_element(By.ID,'kw').size  # 没有()

driver.find_element(By.ID,'kw').text  # 没有()

driver.find_element(By.ID,'kw').get_attribute('ID')  # 括号中的属性要有引号

driver.find_element(By.ID,'kw').is_displayed()  # 返回 True 或 False

4.4 鼠标操作

与鼠标相关的方法都封闭在ActionChains类中

perform()

context_click()  # 右击

double_click()  # 双击

drag_and_drop() # 拖动

move_to_element() # 鼠标悬停

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 定位要悬停的元素
above = driver.find_element(By.LINK_TEXT,'设置')
# 执行悬停操作
ActionChains(driver).move_to_element(above).perform()  # ActionChains(driver)的参数是driver

这步会报错,无法使用LINK TEXT定位到元素。因为LINK TEXT只能定位超链接文本a元素。而百度的设置现在是span元素。如果还是要用 “设置” 定位,是不是可以改成

above = driver.find_element(By.XPATH,"//span[text()='设置']") 

OK.

因为官网鼓励用CSS_SELECTOR, 那么改成

above = driver.find_element(By.CSS_SELECTOR,"span[text()='设置']")  ,失败,不是有效的selector。

above = driver.find_element(By.CSS_SELECTOR,"span:contains('设置')") , 仍失败,有的网文中提到了这种方法,但有的网文说这种方法早被弃用了。

学习CSS_SELECTOR时,也没有像XPATH的text()这样的用法。去百度:CSS selector content

above = driver.find_element(By.CSS_SELECTOR,"span.content('设置')")  ,失败 ,不是有效的selector。

above = driver.find_element(By.CSS_SELECTOR,"span.content='设置'"), 失败,不是有效的selector。

above = driver.find_element(By.CSS_SELECTOR,"span[text='设置']")  失败,无法定位。应该是因数 text被认成一个属性,但其实没有这个属性

后来,找到一篇文章如下写到

看来 CSS_SELECTOR是不适用这种根据content定位的方法。这点也告诉了我,CSS定位虽然定位快捷,但不是说所有定位都可以用这种的,要学会灵活运用各种方法,即便XPATH可能性能略差。

只要能正常定位到元素,就是好方法。

4.5 键盘操作

from selenium.webdriver.common.keys import Keys

.send_keys('')

.send_keys(Keys.BACK_SPACE) # 删除一位

.send_keys(Keys.SPACE)   

.send_keys(Keys.CONTROL,'a')

.send_keys(Keys.ENTER)

4.6 获得验证信息

title = driver.title # 当前页面的标题

now_url = driver.current_url  # 当前页面的URL

text = driver.find_element(By.ID,'kw').text  # 当前页面的文本信息

标签:WebDriver,--,元素,driver,element,Selenium3,选择器,find,CSS
From: https://www.cnblogs.com/guohui2022/p/16865521.html

相关文章

  • 进程对象属性及其它方法
    importmultiprocessingimportProcess,current_processimportos current_process().pid查看当前进程号os.getpid()查看当前进程号os.getppid()查看父进程 ......
  • Promise的部分静态方法(all,race,allSettled)
    Promise.all作用:合并多个promise对象,等待结果全部成功后,返回结果语法:Promise.all([Promise对象1,Promise对象2,Promise对象3]…).then()特点:返回结果是一个数组,注意:如......
  • java匿名内部类访问局部变量为啥要用final
    要明白这个问题,首先要知道java参数传递方式只有值传递,即函数调用过程中形参的改变不会影响实参。允许一下代码:1publicclassDemo{23privateUseruser;4......
  • Debian11 配置 Mariadb
    配置Mariadbnano/etc/mysql/mariadb.conf.d/50-server.cnf修改允许所有IP连接数据库bind-address=0.0.0.0修改数据库目录sudonano/etc/mysql/mariadb.conf.d/50-......
  • 什么是粘包和半包?怎么解决?
    什么是粘包和半包?怎么解决? 粘包和半包问题是数据传输中比较常见的问题,所谓的粘包问题是指数据在传输时,在一条消息中读取到了另一条消息的部分数据,这种现象就叫做粘包......
  • ES6-import后加花括号{}和不加花括号引用模块的区别
    ES6-import后加花括号{}和不加花括号引用模块的区别使用花括号在A文件中想要引用B文件模块,所引入的名字必须与B文件中导出的名字相同在A.js中exportconstA{***}那么......
  • Excel笔记
    Excel入门一、Excel2019工作界面介绍文件菜单选项卡、功能区和组快速访问工具栏公式编辑栏(名称框、编辑按钮、编辑栏)内容编辑区(单元格、行号、列标、水......
  • 【Jmeter】21天打卡 02 之 jmeter的安装
    具体要求a.安装依赖8.0版本以上的Javab.下载最新版本的5.3并安装(安装好后根据自己的情况选择是否要选择语言)c.配置环境变量,cmd下使用Jmeter启动操作步骤1.安装JDK,要......
  • Qt QSqlDatabase::removeDatabase()遇到的问题
    在Qt中想要关闭数据库,并删除连接时发现出错,代码如下:1if(db.isOpen())2{3QStringconnection;4connection=db.connectionName();5db.close();6......
  • 如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用
    稀疏矩阵的概念一个m×n的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号及其他的类型的元素。一般来说,在矩阵中,若数值为0的元素数目远远多于非0元......