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)