Selenium 执行速度慢原因总结

目录

1、显示等待WebDriverWait和隐式等待implicitly_wait()混用:

2、页面加载策略不对

3、显示等待时间设置过长

4、定位策略不是最优

5、测试数据和测试流程设计不够合理


1、显示等待WebDriverWait和隐式等待implicitly_wait()混用:

例如,将隐式等待设置为10秒,将显式等待设置为15秒,可能会导致在20秒后发生超时。

隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就被设置为会话的生命周期。一般情况下不建议使用隐式等待,现在web框架很多元素都是动态加载的建议尽量使用显示等待。

2、页面加载策略不对

例如: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 以加快会话加载速度. 此值适用于整个会话, 因此请确保您的 等待策略 足够普适

3、显示等待时间设置过长

一般web元素加载都比较快,例如:

is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\
        until_not(lambda x: x.find_element(By.ID, "someId").is_displayed())

这个显示等待时间设置为30s超时就有点长了,大部分web元素基本10s都能加载完,要因地制宜不能一视同仁,有时候这样可能在无形当中拉长了操作时间,一些比较耗时的操作(如:下载、上传等)建议单独写个方法

4、定位策略不是最优

一般来说,如果 HTML 的 id 是可用的、唯一的且是可预测的,那么它就是在页面上定位元素的首选方法。它们的工作速度非常快,可以避免复杂的 DOM 遍历带来的大量处理。

如果没有唯一的 id,那么最好使用写得好的 CSS 选择器来查找元素。XPath 和 CSS 选择器一样好用,但是它语法很复杂,并且经常很难调试。尽管 XPath 选择器非常灵活,但是他们通常未经过浏览器厂商的性能测试,并且运行速度很慢。

基于链接文本和部分链接文本的选择策略有其缺点,即只能对链接元素起作用。此外,它们在 WebDriver 内部调用 querySelectorAll 选择器。

标签名(tagName)可能是一种危险的定位元素的方法。页面上经常出现同一标签的多个元素。这在调用 findElements(By) 方法返回元素集合的时候非常有用。

建议您尽可能保持定位器的紧凑性和可读性。使用 WebDriver 遍历 DOM 结构是一项性能花销很大的操作,搜索范围越小越好。

5、测试数据和测试流程设计不够合理

例如有些测试数据可以共用就没必要重复创建了,这样也能节省很多时间。另外有些测试流程也可以尽量简化,例如:只进行一次登录操作,没必要每个流程都从登录开始。。。

你可能感兴趣的:(Selenium,selenium,测试工具)