如何加速 Ruby 页面对象 .visible?或存在?支票
How to Speed up Ruby Page Object .visible? or exists? Checks
我正在使用页面对象 Ruby gem 来测试网页,并且 运行 遇到了一些小的性能问题。我需要检查当前页面上是否存在元素,但是使用我当前使用 .visible 的方法需要等待很长时间,有时需要几十秒?或.exits?当相关元素不实际存在于页面上时,就会发生此性能问题。
html 相当复杂,因此很难提供示例,但这里是 table 代码应该查找的基本格式:
<body>
<div>
<div>
<div>
...
<table>
<tbody>
<tr>
<td>
<a href = "#" onclick="return url_here"
</td>
<td class= "no wrap">Active<
<td class= "no wrap">06/15/2016</td>
<td class= "no wrap">06/15/2016</td>
</tr>
<tr>
<tr>
</tbody>
<tfoot>...</tfoot>
</table>
...
我这样设置元素:
table(:attributes_tbody, :xpath => "//*[@id='Form:agrAttributesTable']/tbody")
然后使用此代码检查此 table 是否出现在页面上:
if attributes_tbody_element.visible?
attributes_tbody_element.each do |row|
if row[1].text == to_title_case(attribute)
p 'EXPECTED ATTRIBUTE EXISTS'
end
end
end
第一个 if 检查花费的时间最多。我确实意识到这些方法有很多需要整理的地方,但我想知道是否有办法缩小正在搜索的范围以加快这些检查的速度?本例中的页面相当小并且使用 JSF 生成,如果有帮助的话。
感谢任何帮助!
我猜这与您在脚本中设置的隐式等待有关。隐式等待会在每次搜索元素时等待规定的时间,直到该元素出现。所以,如果你有很多你正在寻找或检查可见性等的元素丢失了,你将会有很多延迟。我建议您关闭隐式等待并在需要时添加显式等待,例如WebDriverWait
.
有关显式和隐式等待的详细信息,请参阅 Selenium docs。
不确定您是否以及如何解决您的问题,所以这里...
您可以使用 Page-Object 定义默认页面和元素等待时间
PageObject.default_page_wait 和 PageObject.default_element_wait 然后用 element_wait 方法跟进。
已经有 page for the default waits and a great explanation for element wait methods here.
此外,页面对象 "way" 将定义父元素,然后定义子元素,而不是使用 xpath,如答案 .
你的 table 会是这样的:
table(:ur_tbl, :id =>'Form:agrAttributesTable')
ur_tbl.when_present(time_to_wait)
ur_tbl_element[0][1].when_present(time_to_wait)
//使用单元格但也可以使用其他元素
对于您的情况,您还可以将默认元素设置为高等待状态,然后在验证元素的逻辑完成后恢复。
您可能需要稍微额外逻辑的一种情况是在执行加载操作之前数据已经存在于 table 中。我假设该应用程序在此期间有一个页面加载器或一个覆盖元素,应该对其进行验证。
我正在使用页面对象 Ruby gem 来测试网页,并且 运行 遇到了一些小的性能问题。我需要检查当前页面上是否存在元素,但是使用我当前使用 .visible 的方法需要等待很长时间,有时需要几十秒?或.exits?当相关元素不实际存在于页面上时,就会发生此性能问题。
html 相当复杂,因此很难提供示例,但这里是 table 代码应该查找的基本格式:
<body>
<div>
<div>
<div>
...
<table>
<tbody>
<tr>
<td>
<a href = "#" onclick="return url_here"
</td>
<td class= "no wrap">Active<
<td class= "no wrap">06/15/2016</td>
<td class= "no wrap">06/15/2016</td>
</tr>
<tr>
<tr>
</tbody>
<tfoot>...</tfoot>
</table>
...
我这样设置元素:
table(:attributes_tbody, :xpath => "//*[@id='Form:agrAttributesTable']/tbody")
然后使用此代码检查此 table 是否出现在页面上:
if attributes_tbody_element.visible?
attributes_tbody_element.each do |row|
if row[1].text == to_title_case(attribute)
p 'EXPECTED ATTRIBUTE EXISTS'
end
end
end
第一个 if 检查花费的时间最多。我确实意识到这些方法有很多需要整理的地方,但我想知道是否有办法缩小正在搜索的范围以加快这些检查的速度?本例中的页面相当小并且使用 JSF 生成,如果有帮助的话。
感谢任何帮助!
我猜这与您在脚本中设置的隐式等待有关。隐式等待会在每次搜索元素时等待规定的时间,直到该元素出现。所以,如果你有很多你正在寻找或检查可见性等的元素丢失了,你将会有很多延迟。我建议您关闭隐式等待并在需要时添加显式等待,例如WebDriverWait
.
有关显式和隐式等待的详细信息,请参阅 Selenium docs。
不确定您是否以及如何解决您的问题,所以这里...
您可以使用 Page-Object 定义默认页面和元素等待时间 PageObject.default_page_wait 和 PageObject.default_element_wait 然后用 element_wait 方法跟进。
已经有 page for the default waits and a great explanation for element wait methods here.
此外,页面对象 "way" 将定义父元素,然后定义子元素,而不是使用 xpath,如答案
你的 table 会是这样的:
table(:ur_tbl, :id =>'Form:agrAttributesTable')
ur_tbl.when_present(time_to_wait)
ur_tbl_element[0][1].when_present(time_to_wait)
//使用单元格但也可以使用其他元素
对于您的情况,您还可以将默认元素设置为高等待状态,然后在验证元素的逻辑完成后恢复。
您可能需要稍微额外逻辑的一种情况是在执行加载操作之前数据已经存在于 table 中。我假设该应用程序在此期间有一个页面加载器或一个覆盖元素,应该对其进行验证。