我正在使用Page Object Ruby gem来测试网页,并遇到了一些小的性能问题。我需要检查当前页面上是否存在元素,但是使用.visible的当前方法经历了很长的等待时间,有时候在几十秒内。或.exsits?当相关元素在页面上实际存在不时,就会出现此性能问题。
html相当复杂,所以提供一个例子很困难,但这里是代码应该寻找的表格的基本格式:
<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")
然后使用此代码检查页面上是否存在此表:
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
第一次检查是需要花费最多时间的。我确实意识到这些方法有很多可以解决的问题,但我想知道是否有办法缩小搜索范围以加快这些检查的速度?在这种情况下,页面相当小,使用JSF生成,如果有帮助的话。
感谢任何帮助!
答案 0 :(得分:0)
我的猜测是,它与您在脚本上设置的隐式等待有关。隐式等待将等待规定的时间,直到每次搜索元素时元素出现。因此,如果您正在寻找许多元素或检查缺少的可见性等,那么您将会遇到很多延迟。我建议你关闭隐式等待并在需要的地方添加明确的等待,例如WebDriverWait
。
有关显式和隐式等待的详细信息,请参阅Selenium docs。
答案 1 :(得分:0)
不确定您是否以及如何解决您的问题,所以这里......
您可以使用Page-Object定义默认页面和元素等待时间 PageObject.default_page_wait和PageObject.default_element_wait并使用element_wait方法进行跟进。
默认等待已经有page,对元素等待方法here有很好的解释。
此外,Page-Object“方式”不是使用xpath,而是在答案here中定义父元素然后定义子元素。
你的桌子会是这样的:
table(:ur_tbl, :id =>'Form:agrAttributesTable')
ur_tbl.when_present(time_to_wait)
ur_tbl_element[0][1].when_present(time_to_wait)
//使用单元格,但也可以使用其他元素
对于您的情况,您还可以将默认元素设置为等待高,然后在您的逻辑后恢复以验证元素是否完整。
您可能需要稍微额外的逻辑的一种情况是,在执行加载操作之前数据已经存在于表中。我认为应用程序在此期间应该有一个页面加载器或覆盖元素,应该进行验证。