目录
1、显示等待WebDriverWait和隐式等待implicitly_wait()混用:
2、页面加载策略不对
3、显示等待时间设置过长
4、定位策略不是最优
5、测试数据和测试流程设计不够合理
例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。
隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就被设置为会话的生命周期。一般情况下不建议使用隐式等待,现在web框架很多元素都是动态加载的建议尽量使用显示等待。
例如:Selenium get()方法,这个方法默认监听dom 的document.readyState这个方法,当这个方法返回"complete"时才开始操作,所以有时候明明感觉页面加载了还不执行下一步操作。。。
共有三种类型的页面加载策略.
页面加载策略可以在此链接查询 document.readyState , 如下表所述:
策略 | 就绪状态 | 备注 |
---|---|---|
normal | complete | 默认值, 等待所有资源下载 |
eager | interactive | DOM 访问已准备就绪, 但诸如图像的其他资源可能仍在加载 |
none | Any | 完全不会阻塞 WebDriver |
文档的 document.readyState
属性描述当前文档的加载状态。
当通过URL导航到新页面时, 默认情况下, WebDriver将暂缓完成导航方法 (例如, driver.get())直到文档就绪状态完成. 这 并非意味着该页面已完成加载, 特别是对于使用 JavaScript 在就绪状态返回完成后 动态加载内容单页应用程序的站点. 另请注意此行为不适用于单击元素或提交表单后出现的导航行为.
如果由于下载对自动化不重要的资源(例如, 图像、css、js) 而需要很长时间才能加载页面, 您可以将默认参数normal
更改为 eager
或 none
以加快会话加载速度. 此值适用于整个会话, 因此请确保您的 等待策略 足够普适
一般web元素加载都比较快,例如:
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\
until_not(lambda x: x.find_element(By.ID, "someId").is_displayed())
这个显示等待时间设置为30s超时就有点长了,大部分web元素基本10s都能加载完,要因地制宜不能一视同仁,有时候这样可能在无形当中拉长了操作时间,一些比较耗时的操作(如:下载、上传等)建议单独写个方法
一般来说,如果 HTML 的 id 是可用的、唯一的且是可预测的,那么它就是在页面上定位元素的首选方法。它们的工作速度非常快,可以避免复杂的 DOM 遍历带来的大量处理。
如果没有唯一的 id,那么最好使用写得好的 CSS 选择器来查找元素。XPath 和 CSS 选择器一样好用,但是它语法很复杂,并且经常很难调试。尽管 XPath 选择器非常灵活,但是他们通常未经过浏览器厂商的性能测试,并且运行速度很慢。
基于链接文本和部分链接文本的选择策略有其缺点,即只能对链接元素起作用。此外,它们在 WebDriver 内部调用 querySelectorAll 选择器。
标签名(tagName)可能是一种危险的定位元素的方法。页面上经常出现同一标签的多个元素。这在调用 findElements(By) 方法返回元素集合的时候非常有用。
建议您尽可能保持定位器的紧凑性和可读性。使用 WebDriver 遍历 DOM 结构是一项性能花销很大的操作,搜索范围越小越好。
例如有些测试数据可以共用就没必要重复创建了,这样也能节省很多时间。另外有些测试流程也可以尽量简化,例如:只进行一次登录操作,没必要每个流程都从登录开始。。。