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