如何优化selenium webdriver的执行速度
让自动化测试脚本正常工作只是自动化测试的第一步,由于自动化脚本会经常执行并更新,因此测试脚本需要
- 可以快速执行
- 容易维护
- 容易阅读
本文会提供一些让 selenium 自动化脚本运行的更快的技巧。
在 page_source 中断言 text 比直接使用 text 属性断言要快
我们经常会需要断言页面中的某个部分包含一些具体的文本,下面的语句的输出结果是相同的
driver.page_source
driver.find_element(:tag_name => ‘body') .
不过对于第二条语句来说,selenium 需要去分析页面的结构,最后再找到对应的元素并输入结果,这显然是需要花费时间的。如果页面比较小的化,那么二者的差距可能不大,不过对于大的页面来说,第一条语句速度明显会更快一些。
使用 page text 的情况
expect(driver.find_element(:tag_name => "body").text).to include("platform- and language-neutral wire protocol")
使用 page source 的情况
expect(driver.page_source).to include("platform- and language-neutral wire protocol")
来看一下差距
Method 1: Search whole document text took 0.823076 seconds
Method 2: Search whole document HTML took 0.039573 seconds
当然两者的使用场景是不太相同的,不过我们这里只关注性能,显然 page source 要更快速一些。
元素越具体,获取 text 的速度越快
根据经验,我们可以通过缩小更具体的 Web 控件的范围来节省执行时间。下面的两个断言语句在很大程度上实现了相同的功能,但在执行时间上有很大的不同。
expect(driver.find_element(:tag_name, “body”).text).to include(“language-neutral wire”)
这条语句的执行时间是 0.93s
expect(driver.find_element(:id, “abstract”).text).to include(“language-neutral wire”)
这个断言只执行了 0.02s
很明显,第 2 个断言除了在执行速度上更快之外,断言也更加精确,更容易理解。
使用变量去缓存没有变化的元素
我经常看到有人编写如下测试来检查页面上的多个文本。
driver.navigate.to(site_url + "/WebDriverStandard.html") expect(driver.find_element(:tag_name, "body").text).to include("Firefox")
expect(driver.find_element(:tag_name, "body") ").text).to include("chrome")
expect(driver.find_element(:tag_name, "body").text).to include("W3C")
执行时间 2.35s
上述三个测试语句非常低效,因为每个测试语句都调用driver.find_element(:tag_name, 'body').text
,当网页很大时,这可能是费时费力的工作。