举栗:
driver.find_element(By.CSS_SELECTOR, "i#cart_num").click()
class选择器语法:. 开头表示class选择器,或者使用[class='class属性值']
如果具有多个属性值的class,则需要传入全部的属性值
driver.find_element(By.CSS_SELECTOR, ".class属性值")driver.find_element(By.CSS_SELECTOR, "[class='class属性值']")
举栗:
driver.find_element(By.CSS_SELECTOR, ".but2").click()driver.find_element(By.CSS_SELECTOR, "[class='but2']").click()
属性选择器单个属性语法:
driver.find_element(By.CSS_SELECTOR, "标签名[属性='属性值']")driver.find_element(By.CSS_SELECTOR, "[属性='属性值']")
举栗:
driver.find_element(By.CSS_SELECTOR, "input[placeholder='请输入你要查找的关键字']").send_keys("测试蔡坨坨")driver.find_element(By.CSS_SELECTOR, "[placeholder='请输入你要查找的关键字']").send_keys("测试蔡坨坨")
多个属性语法:注意与xpath的区别
driver.find_element(By.CSS_SELECTOR, "标签名[属性1='属性值1'][属性2='属性值2']")
举栗:
driver.find_element(By.CSS_SELECTOR, "input[name='key'][class='but1']").send_keys("测试蔡坨坨")
模糊匹配driver.find_element(By.CSS_SELECTOR, "[属性^='开头的字母']") # 获取指定属性以指定字母开头的元素driver.find_element(By.CSS_SELECTOR, "[属性$='结束的字母']") # 获取指定属性以指定字母结束的元素driver.find_element(By.CSS_SELECTOR, "[属性*='包含的字母']") # 获取指定属性包含指定字母的元素
标签选择器语法:
driver.find_element(By.CSS_SELECTOR, "标签名") # 例如:input、button
层级关系父子层级关系:父层级策略 > 子层级策略 (也可以使用空格连接上下层级)
祖辈后代层级关系:祖辈策略 后代策略
> 与 空格 的区别:大于号必须为子元素,空格则不用
first-child第一个子元素
<div class="help"> <a href="http://127.0.0.1">首页</a> <a href="http://127.0.0.1/buy">我的订单</a> <a href="http://127.0.0.1//help">联系客服</a></div>
driver.find_element(By.CSS_SELECTOR, ".help>a:first-child").click() # 首页
last-child最后一个子元素
driver.find_element(By.CSS_SELECTOR, ".help>a:last-child").click() # 联系客服
nth-last-child()倒序
driver.find_element(By.CSS_SELECTOR, ".help>a:nth-last-child(2)").click()# 我的订单
nth-child()正序
driver.find_element(By.CSS_SELECTOR, ".help>a:nth-child(3)").click()# 联系客服
干儿子和亲儿子若一个标签下有多个同级标签,虽然这些同级标签的 tag name 不一样,但是他们是放在一起排序的 。
# author: 测试蔡坨坨# datetime: 2022/10/23 20:20# function: css_selector 不区分干儿子和亲儿子import timefrom selenium import webdriverfrom selenium.webdriver.common.by import Bydriver = webdriver.Chrome()driver.get("https://www.baidu.com")driver.maximize_window()# css_selector 不区分干儿子和亲儿子,# 若一个标签下有多个同级标签,虽然这些同级标签的tag name不一样,但是他们是放在一起排序的# 打开百度,在搜索框中输入 测试蔡坨坨 ,点击百度一下driver.find_element(By.CSS_SELECTOR, "form#form>span:nth-child(8)>input").send_keys("测试蔡坨坨")driver.find_element(By.CSS_SELECTOR, "form#form>span:nth-child(9)>input").click()
元素定位二次封装在之前的文章中我们介绍过UI自动化测试框架,可参考往期文章「五分钟搞懂 POM 设计模式」 。
框架中的base_page模块对Selenium一些常用的API进行二次封装,其中就有对find_element的封装 。
base_page.py:
class BasePage(object):def __init__(self, driver):self.logger = GetLogger().get_logger()self.driver = driverdef wait_ele_visible_(self, loc, loc_doc, times=3, poll_frequency=0.5):"""等待元素可见:param loc: 元素定位:param loc_doc: 元素描述:param times: 最长等待时间:param poll_frequency: 轮询频率,调用 until 或 until_not方法中的间隔时间,默认为0.5秒:return:"""try:@do_timedef fun():WebDriverWait(self.driver, times, poll_frequency).until(EC.visibility_of_element_located(loc))self.logger.info("等待【{}】元素【{}】出现,耗时:{}豪秒".format(loc_doc, loc, fun()))except Exception:self.logger.error("等待【{}】元素【{}】出现失败".format(loc_doc, loc))raisedef find_element_(self, loc, loc_doc):"""查找元素:param loc: 元素定位 例如:login_icon_loc = (By.ID, "sb_form_q"):param loc_doc: 对元素的描述:return:"""try:self.logger.info("开始查找【{}】元素【{}】".format(loc_doc, loc))self.wait_ele_visible_(loc, loc_doc)return self.driver.find_element(*loc)except Exception:self.logger.error("查找【{}】元素【{}】失败".format(loc_doc, loc))raise
经验总结扩展阅读
- 三 Selenium+Python系列 - 常见浏览器操作
- 二 Selenium+Python系列 - 元素定位那些事
- 厨房小蟑螂怎么彻底消灭
- 怎么快速学会河南话
- 恋爱不懂及时止损,会被伤得彻底的星座
- 感情中慢慢才学会信任对方的星座
- 为爱不择手段而彻底失去爱情的星座
- selenium4-定位单个页面元素
- 感情里学会经营和思考的星座女
- 家里有蛾蠓怎么彻底清除