web自动化03-XPATH定位与CSS选择器及三种等待

1、为什么用相对路径

  • 相对路径简洁些,一般就一两个层级,
  • 兼容性好些,绝对路径改个层级,路径就得改,相对路径除非改定位用的路径参数,否则不需要修改

   什么样XPATH表达式是好的XPATH表达式,

- 长短比较, 短的,或者精简的表达式,就相对好的表达式
- 表示找到了最明显的特性,( id, name(一般是from表单中要传参的,相当于key), text, 根据前面各种html元素喜欢和什么属性搭配起来使用的。)
- 要避免依赖的层级过多

2、Xpath定位方法总结

  •  标准语法                     --      //标签名[@属性名='属性值']
  • * 任意标签或者属性     --     //*[@name='wd']
  • 多个条件控制-and       --     //input[@id='' and @name='']             and 前后要加空格
  • text()文本                    --     //a[text()='新闻']
  •  contains包含              --    //input[contains(text(), '')] 
  • 索引                            --     (//*[contains(text(), '')])[1]                    索引是从 1 开始的。一定要加上括号    当元素没有明显的属性和特征, 索引,没办法了才用
  • 公式 : //标签名[]/关系名称::标签名[]
  • 找找哥哥姐姐: //input[@name='wd']/preceding-sibling::span           span表示标签名
  • 找找弟弟妹妹: //input[@name='wd']/following-sibling::span
  • 找祖先: //input[@name='wd']/ancestor::span

3、Xpath定位注意事项

  • XPATH定位,and两边要有空格
  • 兄弟姐妹没啥特征时,用轴运算,或者索引
  • text()是函数,不是属性,属性定位要@
  • 为了减少定位问题,最好写完的xpath现在浏览器中查询下,防止有问题
  • 定位的元素属性值是不会动态变化的,如果该属性值会发生变化,不要使用这个属性定位
  • 使用属性的话,索引值为1开始,且前面要加(),如 (//*[contains(text(), '')])[1] 索引

4、CSS选择器-#表示id,.表示class

  •  #kw 表示id=kw的元素 ,,,详细的表示:  xpath: //*[@id='kw']
  • .s_ipt 表示 class="s_ipt" 的元素 详细的表示:  //*[@class='s_ipt']

5、CSS和XPATH的区别-css简洁,更快,不能text定位,xpath功能更强大

  • 两者作用都是一样的,前端工程师用得到,xpath测试领域用的多
  • css更简洁,更快
  • css不能文本定位
  • XPATH的功能更强大

6、什么时候元素属性值可能会变化,怎么确定?

  • 1、 多刷新几次页面,看属性值会不会变
  • 2、 id='kw1' 属性里面有数字
  • 3、 属性中有莫名其妙字符串
  • 4、 active hidden,如  class= "s_ipt active"

7、等待-强制等待,隐性等待(每次用),显性等待(什么时候需要用)

强制等待:等久了,浪费时间, 等时间短了,还没来

# 强制等待
import time
time.sleep(3)

隐形等待:

  • 只要是查找元素, 每一次查找元素,都有 8s 时间, 如果超过8s, 元素还没出现,就会报错。
  • 非常智能 , 什么时候能找到,什么时候继续执行。
  • 全局设置,只需要设置一次,使用简单
# 隐性等待
from selenium import webdriver

browser = webdriver.Chrome()
# 设置 8s 隐性等待
browser.implicitly_wait(8)

显性等待:

可以控制条件: 等待某个元素可以被点击了, 可以被看见了等等。

# 显性等待 等待完成后再写执行代码
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()
# 显性等待,设置等待,传递浏览器和超时时间
wait = WebDriverWait(browser, timeout=8)
# 定位元素方法
locator = ('xpath', '定位xpath的表达式')
# 等待条件可点击
when = expected_conditions.element_to_be_clickable(locator)
wait.until(when)


# 定位搜索结果的元素
el = browser.find_element('xpath', '定位xpath的表达式')
el.click()

broswer.quit()

 8、五种显性等待条件

  • 等待页面标题 
# 等待title是否显示
wait1 = WebDriverWait(driver, timeout=5)
when1 = expected_conditions.title_is("百度一下,你就知道")
wait1.until(when1)
  • 等待页面url
# 等待url是否加载
wait = WebDriverWait(driver, timeout=5)
when = expected_conditions.url_contains("https://www.baidu.com/")
wait.until(when)
  • 等待元素是否被加载-等同于隐性等待
# 等待是否可见-同隐性等待
# dom中存在,但是不一定可见
# 初始化一个定时器
wait3 = WebDriverWait(driver, timeout=5)
locator = (By.ID, 'kw')
when3 = expected_conditions.presence_of_element_located(locator)
# 条件是否满足
wait3.until(when3)
  • 等待元素是否可见 -

    when4 = expected_conditions.visibility_of_element_located(locator)

  • 等待元素是否点击-

    when2 = expected_conditions.element_to_be_clickable(locator)

posted @ 2022-03-20 20:43  依羽杉  阅读(270)  评论(0)    收藏  举报