八大定位方式
导包:
from selenium.webdriver.common.by import By
1、标签 id 属性的定位
ele = driver.find_element(by=By.ID, value="search-input")
2、标签 name 属性的定位
ele = driver.find_element(by="name", value="search-input")
3、需要标签名称的值
ele = driver.find_element(by="tag name", value="input")
4、定位元素的依据是元素中的class 属性
# class属性值中如果带有空格,意味着它其实是一个组合属性值;所以在使用class name的定位方式的时候,class的属性值,只能接受一个(以属性值中的空格符合 来 区分 属性值);
5、通过a标签中的文字定位(text属性)
ele = driver.find_element(by=By.LINK_TEXT, value="登录")
6、link text 的模糊匹配的定位方式,需要a标签中部分 text 属性的值
ele = driver.find_element(by=By.PARTIAL_LINK_TEXT, value="登")
7、通过css定位
7.1 绝对路径
#使用标签名标识层级名称(当前路径名称),使用> 标识下一级
ele = driver.find_element(by=By.CSS_CELECTOR, value="html>body>div>div>div>form>div>input")
7.2 相对路径
# 表示 前面有多少路径我都忽略,我从input开始寻找
ele = driver.find_element(By.CSS_SELECTOR, "input")
7.3 属性过滤
#使用[]标识内部内容为属性的过滤字段
ele = driver.find_element(By.CSS_SELECTOR, 'html>body>header>div>div>ul>li>a[class="am-dropdown-toggle "]')
7.4 其他的过滤方式
参考:https://www.w3school.com.cn/cssref/css_selectors.asp
8、通过xpath定位
8.1 绝对路径
#使用标签名标识层级名称(当前路径名称),使用 / 标识下一级
ele = driver.find_element(by=By.XPATH, value="html/body/div/div/div/form/div/input")
8.2 相对路径
# 表示 前面有多少路径我都忽略,我从input开始寻找
ele = driver.find_element(By.XPATH, "//input")
8.3 属性过滤
#与css 不同,它需要使用@符号标识属性
ele = driver.find_element(By.XPATH, '/html/body/header/div/div/ul/li/a[@class="am-dropdown-toggle "]')
#或者
ele = driver.find_element(By.XPATH, '//a[@class="am-dropdown-toggle "]')
# 多属性定位
driver.find_element(By.XPATH,'//a[@title="tutorial" and @rel="follow"]')
# xpath模糊匹配的函数有两种: starts-with和和contains
#1、class属性值以btn开头的label元素
driver.find_element(By.XPATH,"//label[starts-with(@class,'btn')]")
#2、通过属性值包含btn的label元素
driver.find_element(By.XPATH,"//label[contains(@class,'btn')]")
# xpath通过文本定位元素,文本内容的定位是利用html的text字段进行定位的方法
driver.find_element(By.XPATH, "//span[text()='下一步']")
# 文本内容也支持starts-with和contains模糊匹配
driver.find_element(By.XPATH,"//span[starts-with(text(),下一步')]”)
driver.find_element(By.XPATH,"//span[contains(text(),'下一步')]")
```
xpath常见语法一览表
表达d 说明 举例
/ 从根节点开始选取 /html/div/span
// 从任意节点开始选取 //input
. 选取当前节点
.. 选取当前节点的父节点 //input/.. 会选取 input 的父节点
@ 选取属性,或者根据属性选取 //input[@data] 选取具备 data 属性的 input 元素 //@data 选取所有 data 属性
* 通配符,表示任意节点或任意属性 //*[@name='searchKey'] //*[@*='s_int']"
```
8.4 其它过滤方式
参考:https://www.runoob.com/xpath/
特殊定位方式
1、元素对象内定位(父子元素定位)
from selenium import webdriver
from selenium.webdriver.common.by import By
# 假设您已经有了一个Selenium WebDriver实例叫做driver
# 定位父元素
parent_element = driver.find_element(By.XPATH, "//div[@class='parent']")
# 定位子元素相对于父元素的位置
child_element = parent_element.find_element(By.XPATH, ".//div[@class='child']")
# 现在您可以对子元素执行操作,例如点击
child_element.click()
2、多元素定位
# 返回的是一个list,list中包含的是元素对象
ele = []
eles = driver.find_elements(By.XPATH, "//input")
3、网格定位
参考:https://www.cnblogs.com/rmticocean/p/17966286
4、下拉列表,要求标签名必须是select的标签
from selenium import webdriver
from selenium.webdriver.support.ui import Select
# 启动浏览器
driver = webdriver.Chrome()
# 打开网页
driver.get("http://www.example.com")
# 定位到下拉列表元素,要求标签名必须是select的标签
select = Select(driver.find_element_by_id("dropdown"))
# 通过索引选择
select.select_by_index(0) # 选择第一个选项
# 通过值选择
select.select_by_value("value1")
# 通过文本选择
select.select_by_visible_text("text1")
# 关闭浏览器
driver.quit()
元素操作
1、输入操作
ele.send_keys("呵呵")
2、点击操作
ele.click()
3、截图操作
# 保存图片到本地
ele.screenshot('1.png')
4、获取元素的属性的值
ele.get_attribute('id')