- selenium
-
-
-
- 元素定位
- 基本语句
- find_element('key','value')
- 有多个元素符合定位条件时仅返回第一个,若没有则抛出异常
find_element_by_key('value')
- 有多个元素符合定位条件时仅返回第一个,若没有则返回none
find_elements('key','value')
- 以列表形式返回符合条件的所有元素,若没有则返回空列表
基础知识
id
name
- 有可能一个名字有多个元素共用,定位时只按顺序返回第一个
- 使用find_elements('name','value')[num],使用list定位元素
- 注:元素位置下标从0开始
class name(特指具有class属性的元素)
- 包含多个类的元素叫复合样式,不能直接定位,可使用如下的css selector定位
tag name
- 一般用于同类元素,比如说input
返回同类元素的个数
-
- elements = driver.find_elements('tag name', 'input') print(len(elements))
link text<a>
- 完整超链接a标签
- <a href="xxx" target="xxx">完整文字</a>
partial link text<a>
xpath(万能,可在chrome中$x调试)
- 绝对路径法(需要从根逐级写到元素位置 )
- ('xpath','/html/xxx..../xxx')
相对路径法(从定位元素往上找到能唯一定位的父元素为止)
- ('xpath','//唯一父元素/tr[3]/td[2]/xxx')
- ('xpath','//唯一父元素/tr[3]//xxx')
- 注:相同标签元素可直接用‘标签[顺序]’
- 注:有省略时可同时使用多个//
- 注:元素位置下标从1开始
属性定位
- 单属性:('xpath',"//元素标签[@属性='属性值']")
- 多属性:('xpath',"//元素标签[@属性1='属性值'][@属性2='属性值']")
- 注意单双引号
- 若定位元素属性过多,可先找到具有唯一属性的父元素,再通过相对路径找到定位元素
模糊定位
- 模糊定位中的text()表示查找元素文本
- ('xpath',"//元素标签或*号[contains(text(),‘元素中包含的文本关键字’)]")
- ('xpath',"//元素标签或*号[contains(@属性名,‘属性中包含的关键字’)]")
调试-在Chrome中检验Xpath的有效性
- 调试台-Console
- 语法:$x("Xpath")
css selector(万能,可在chrome中$$调试)
- 利用元素标签定位所有相同的元素
- find_element('css selector','tr')
class属性定位(可定位复合样式)
- 属性前加.
find_element('css selector','.属性1.属性2')
-
id属性定位
- id前加#
- find_element('css selector','#属性名')
多属性定位
- find_element('css selector',”[属性1=‘属性名’][属性2=‘属性名’]“)[元素位置list下标)]
- 注:元素位置下标从0开始
利用标签父子关系定位
- driver.find_element('css selector', 'tbody > tr:nth-child(1) > td:nth-child(2) > input')
- 注:元素位置下标从1开始
爷孙关系:可直接加空格
-
- find_element('css selector', 'tbody > tr:nth-child(3) i')
模糊定位:*=
- find_element('css selector', '标签[属性名*=“属性所含关键字"]')
- 调试语法:$x("Xpath")
总结
- 方式选择
- 优先考虑id,name等简单的定位方式
- xpath功能强悍但性能较差
- 一组元素优先考虑name或tag name
- 链接用link text或partial link text
注意事项
- 找唯一属性
- 优先相对路径
- 不要使用唯一属性定位
- 多与研发沟通,尽量加上id,name,减少不合理页面的元素,排除重复id
元素等待
- improt time
强制等待
-
隐式等待
- driver.implicitly_wait()
- 只需设置一次,全局有效
- 设置的为最长等待时间
- 元素出现即刻停止等待
显示等待
- 语法操作
- 导入
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
常见EC方法
- title_is(strtitle)
title_contains(strtitle)
presence_of_element_located(locator)
visibility_of_element_located(locator)
- 判断元素是否可见,可见代表非隐藏,并且元素宽高皆不为0
invisibility_of_element_located(locator)
element_to_be_clickable(locator)
- 判断某个按钮元素是否可见并且enable的,这样的话才叫可点击
text_to_be_present_in_element(locator,txet)
使用示例
- WebDriverWait(driver,5).until(EC.text_to_be_present_in_element(('id','msg'),'出错啦'))
- 说明:locator为定位方法
- 可针对每一个元素进行单独设置
- 若显示隐式等待同时设置,则以最长等待时间为准
元素操作
-
- 常用简单操作
- clear
send_keys
click
text
get_attribute(name)
is_displayed
is_enabled
is-selected
maximize_window()
常用复合操作
- 复选框常见操作
- is_displayed() is_enabled() is_selected()
发送复合按键
- from selenium.webdriver.common.keys import Keys send_keys(Keys.SHIFT,"xxx")
- 示例:send_keys(Keys.CONTRAL+'a')
下拉列表常见3个操作
- from selenium.webdriver.support.ui import Select
- Select(driver.find_element('tag name', 'select')).select_by_index(3)
Select(driver.find_element('tag name', 'select')).select_by_value('sh')
Select(driver.find_element('tag name', 'select')).select_by_visible_text('成都')
frame
- switch_to.frame()
- 从A frame切到B frame
- 示例:driver.switch_to.frame(driver.find_element('id', 'login_frame'))
switch_to.default_content()
文件上传
- 定位type=file的元素
- 直接使用send_keys(r"本地文件绝对路径")
多窗口切换
- curhandle = driver.current_window_handle
allhandle=driver.window_handles
if handle in allhandle: if handle != curhandle:
driver.switch_to.window(curhandle)
driver.window_handles[num]
悬浮菜单
-
- from selenium.webdriver.common.action_chains import ActionChains
item = driver.find_element('id', 's-usersetting-top')
ActionChains(driver).move_to_element(item).perform()
-
- find_element()定位悬浮菜单内的元素
ajax类下拉菜单(百度搜索指引)
-
-
- 用class定位一整类元素并返回成列表对象,再利用列表下标指定某个元
posted @
2022-03-20 15:35
Ken3
阅读(
161)
评论()
收藏
举报