WebDriver 元素
定位方式
1. id
2. name
3. class_name
4. tag_name
5. link_text
6. partial_link_text
7. xpath
8. css定位
以百度为例:
import time
import selenium
from selenium import webdriver
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
elem=driver.find_element_by_id("kw")
# elem=driver.find_element_by_name('wd')
#elem = driver.find_element_by_tag_name('input') #如果有多个同名标签,则返回第一个
elem.send_keys("疫情") #输入搜索的关键词
time.sleep(3)
elem.send_keys(selenium.webdriver.common.keys.Keys.RETURN) #RETURN 键盘enter键
time.sleep(3)
driver.close()
link_text/partial_link_text
#coding:utf-8
import time
import selenium
from selenium import webdriver
driver =webdriver.Chrome()
driver.get("https://www.baidu.com/") #打开指定网页,在get括号后面加入url
time.sleep(2) #使用时间包,休眠2s
driver.find_element_by_link_text("新闻").click() #精确匹配超链接载体
# bro.find_element_by_partial_link_text("闻").click()#模糊匹配超链接载体
time.sleep(2)
driver.quit()
xpath定位
定位方式
用法:
1. /(绝对路径,从根节点选取)
2. //(相对路径,所有子代节点,不用考虑是否直接子节点)
3. @ 选取属性
4. “.”选取当前节点
5. “..”选取当前节点的父节点
6. nodename 选取此节点的所有子节点
通过属性定位
写法概括
属性判断条件:最常见为id,name,class等等,属性的类别没有特殊限制,只要能够唯一标识一个元素即可。
xpath = "//标签名[@属性='属性值']
当某个属性不足以唯一区别某一个元素时,也可以采取多个条件组合的方式,如下:
xpath= "//input[@type='XX' and @name='XX']"
利用contains()方法定位,也叫模糊定位
xpath = "//标签名[contains(@属性, '属性值')]"
示例代码:
import time
import selenium
from selenium import webdriver
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
#id,name,class用法一致,这里以id为例
# elem = driver.find_element_by_xpath('//input[@id = "kw"]') #必须要加//代表相对路径
elem = driver.find_element_by_xpath('//*[@id = "kw"]') #必须要加//代表相对路径,/代表绝对路径,一般使用相对路径
"""elem = driver.find_elements_by_xpath('//div[contains(@class,"s_tab")]') #取div标签下所有class=s_tab的
print(elem)
输出元素对象结果:[<selenium.webdriver.remote.webelement.WebElement (session="cadc1fbb03cacc2b8080889b3c169728", element="48b912b1-3f7b-4383-9045-56985d83a3f1")>, <selenium.webdriver.remote.webelement.WebElement (session="cadc1fbb03cacc2b8080889b3c169728", element="b2170a65-3eaa-4383-93f0-fefdf956edfd")>]
"""
elem.send_keys("疫情") #输入搜索的关键词
time.sleep(3)
elem.send_keys(selenium.webdriver.common.keys.Keys.RETURN) #RETURN 键盘enter键
time.sleep(3)
driver.close()
利用text()方法定位
写法概括
xpath = "//a[text()='新闻']"
示例:
import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
elem = driver.find_element_by_xpath('//a[text()="新闻"]')
elem.click()
time.sleep(3)
driver.close()
PS:如果一个元素无法通过自身属性直接定位到,则可以先定位它的父(或父的父,它爷爷)元素,然后再找下一级即可
例如定位百度搜索框,可以按照此种方式试验一下(主要是看一下这个思路)
import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
xpath = "//a[text()='上一步']"
driver.find_element_by_xpath("//form[@id='form']/span[contains(@class,'s_ipt_wr')]/input").send_keys('python')
time.sleep(3)
driver.close()
定位百度一下按钮
import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
#错误写法
"""driver.find_element_by_xpath("//form[@id='form']/span[@id='s_btn_wr']/input").click() # 报错 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//form[@id='form']/span[@id='s_btn_wr']/input"}
原因是:因为在实际中发现通过webdriver打开的浏览器网页中<span>标签没有id属性了"""
#正确写法
driver.find_element_by_xpath("//form[@id='form']/span[@class='bg s_btn_wr']/input").click()
time.sleep(3)
driver.close()
注意:在第二步定位元素时,没有用的id属性,因为在实际中发现通过webdriver打开的浏览器网页中标签没有id属性了(所以选用标签的class属性,并且通过contains()模糊定位),如下图所示:
xpath轴
xpath相关内容概述
w3cschool上的定义如下:
语法
descendant表示取当前节点的所有后代元素
代码示例
import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_xpath("//form[@id='form']/descendant::input[@id='su']") .click()#必须要加//代表相对路径
driver.close()
验证路径正确性:
following表示选取当前节点结束标签之后的所有节点
注意这里说的是“结束标签之后”,所以在用这个轴进行定位时要看清目标标签的与辅助定位标签的层级关系
所以上例中就不能通过标签结合following来定位,因为标签在标签里面;
分析一下:标签的上级是一个标签,这个标签上面也有一个标签,可以通过它来定位
xpath= "//span[@id='s_kw_wrap']/following::input[@id='su']"
//span[@id='s_kw_wrap']表示定位到id属性为s_kw_wrap的<span>标签,/following::input[@id='su']表示找到<span>结束标签(即</span>)后的所有input标签,然后通过[@id='su']精准定位到id属性为'su'的<input>标签
(3)parent::可指定要查找的当前节点的直接父节点,例如,父节点是个div,即可写成parent::div,如果要找的元素不是直接父元素,则不可使用parent,可使用ancestor,代表父辈、祖父辈等节点;
child::表示直接子节点元素
following-sibling只会标识出当前节点结束标签之后的兄弟节点,而不包含其他子节点
代码示例:
1.xpath = //span[@class = 'title' and text()='换肤']/parent::a/following-sibling::a/child::span[@class='title' and text()='消息']
2.xpath = //span[@class = 'title' and text()='换肤']/parent::a/following-sibling::a[1]/span[2]
CSS定位
常用策略 (方式)
1. id选择器
2. class选择器
3. 元素选择器
4. 属性选择器
5. 层级选择器
ID选择器
说明:根据元素id属性来选择
格式:#id 如:#userA <选择id属性值为userA的所有元素>
class 选择器
说明:根据元素class属性来选择
格式:.class 如:.telA <选择class属性值为telA的所有元素>
元素选择器
说明:根据元素的标签名选择
格式:element 如:input <选择所有input元素>
属性选择器
说明:根据元素的属性名和值来选择
格式:[attribute=value] 如:[type="password"] <选择所有type属性值为password的值>
补充:
input[type^='p'] 说明:type属性以p字母开头的元素
input[type$='d'] 说明:type属性以d字母结束的元素
input[type*='w'] 说明:type属性包含w字母的元素
input[type~='value'] 说明: type属性包含value的元素
input[type=value] 说明: type属性是value的所有元素
层级选择器
说明:根据元素的父子关系来选择
格式:element>element 如:p>input <返回所有p元素下所有的input元素>
提示:> 可以用空格代替 如:p input 或者 p [type='password']
代码示例
import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
driver =webdriver.Chrome()
driver.maximize_window() #最大化窗口
driver.get("http://www.baidu.com")
driver.implicitly_wait(8) #隐式等待
elem = driver.find_element_by_xpath('//input[@id = "kw"]').send_keys("疫情") #必须要加//代表相对路径
time.sleep(3)
elem.send_keys(selenium.webdriver.common.keys.Keys.RETURN) #RETURN 键盘enter键
time.sleep(3)
jump=driver.find_elements_by_css_selector('div.c-border a') #该div标签下的所有的a标签元素对象结果
# print(c)
# #可以循环获取每一个元素对象结果
# # for i in range(len(jump)):
# # print(jump[i].click())
jump[0].click()
driver.close()
XPath与CSS类似功能对比
定位方式 | XPath | CSS |
---|---|---|
元素名 | //input | input |
id | //input[@id=‘userA’] | #userA |
class | //*[@class=‘telA’] | .telA |
属性 | 1. //[text()=“xxx”] 2. //[starts-with(@attribute,‘xxx’)] 3. //*[contains(@attribute,‘xxx’)] | 1. input[type^=‘p’] 2. input[type$=‘d’] 3. input[type*=‘w’] |