selenium 定位
1、find_element && find_elements 的区别:
1、 find_element 得到的是一个webelement的对象,只会返回查找到的第一个对象; find_elements 得到的是一个列表,返回查找到的所有,并保存到列表中。 2、如找不到, print(driver.find_element_by_id('kw')) find_element 会报错,NoSuch ElementException print(driver.find_elements_by_id('kw')) find_elements 不会报错,但是会返回空列表 3、当我们想验证通过某个表达式,能否找到元素,判断页面是否存在元素 # find_element 不存在会报错 ,可通过try...except...进行捕获 try: driver.find_element_by_id('kw') print('元素存在') except: print('元素不存在') # find_elements 得到的是一列表,条件不满足是,可通过条件判断,返回True、False if driver.find_elements_by_id('kw') print('元素存在') else: print('元素不存在') #在自动化测试中,一般使用find_element,不加s会更常见
2、driver.find_element 例子
#唯一属性 driver.find_element(By.XPATH, "//a[text()='%s']" % str(home_text)).click() driver.find_element(By.XPATH, "//input[@placeholder='%s']" % str(repo_member_search_text)).send_keys(Keys.ENTER) driver.find_element('class name', 'annotationList___Ctabb').find_elements(By.TAG_NAME, "div") driver.find_element('xpath', "//span[text()=‘%s’]/div[3]/form/span[1]/input“ % str(edit_text_confirm_button_text)).click() #属性不唯一 driver.find_element(By.XPATH, "//span[contains(text(),'%s')]" % str(order_cancel_button_text)).click() #class属性中间有空格时,叫做复合类,复合类一般不建议通过class属性来定位,因为会报错。 解决方法:只写复合类属性的某一部分(不能有空格),但与其他class属性重复的概率就会增加 #绝对路径比较复杂,一般写xpath不太会使用绝对路径,一般使用相对路径。 #相对路径以//开始,如//div[@class=’schbox’]/form/input[1],首先要找的是class属性为schbox的那个div,然后再找这个div下的form下的第1个input
3、XPATH
1)基本用法(属性唯一:直接@属性):
如:
//input[@name='q']
//input[@class=‘but1’]
//input[@placeholder=‘请输入你要查找的关键字’]
//input[@id='kw']
//span[text()="设置"]
2)and组合属性(属性不唯一:可以加and,可以加多个and):
如:
//input[@name='q' and @type='anony_srh']
//a[text()="更多" and @name="tj_briicon"]
//input[@type=‘text’ and @class=‘but1’ and @name=‘key’]
input[name=‘key’][class=‘but1’]
3)单斜杠(/),通过父代找子带:
//div[@id='kw']/div[@class='anony_srh'],//div[@id="s-top-left"]/a[text()="新闻"]
4)双斜杠(//),通过祖先找子孙元素:
//div[@id='kw']//div[@class='anony_srh']
5)..通过子代找父代元素:
//div[@class='anony_srh']/..
6)通过text文本,获取元素:
//a[text()='百度'] # 不可用@,因为它不是属性 =====> 全部匹配
7)text()常与contains组合使用(contains是一个关键字,如//input[contains(@placeholder,‘请输入你’)],表示要查找placeholder属性包含“请输入你”的控件,包含内容需要是连续的
):
//a[contains(text(),'百度')] ====> 部分匹配
//a[contains(@class,'anony')]
8)索引(需加括号):
(//a[contains(text(),'百度')])[1] # 从1开始
9)轴运算:
following_sibling(元素之后,弟弟) //*[@class='account-form-3rd-hd']//following_sibling::div
preceding_sibling(元素之前,哥哥) //[@class='account-form-3rd-hd']//preceding_sibling::div
ancestor(祖先) //a//ancestor::div[@id='anony-srh']
10)* 任意标签下的条件:
//*[@id='kw']
参考链接:
https://blog.csdn.net/weixin_45294964/article/details/111672086
https://blog.csdn.net/m0_53628535/article/details/118435788