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

 

posted @ 2023-04-19 16:30  小嘉欣  阅读(54)  评论(0编辑  收藏  举报