如何在瓦蒂尔完成元素搜索?



我应该保存第 https://www.walmart.com/ip/Ematic-9-Dual-Screen-Portable-DVD-Player-with-Dual-DVD-Players-ED929D/28806789 页的所有评论。为此,我使用Watir,因为它是动态页面,我需要单击按钮来更新结果。我检查按钮是否存在,然后抓取评论。但是当所有评论都保存在最后一页上时,它没有完成处理并搜索元素,并且在 30 秒后出现错误。

错误:

Watir::Exception::UnknownObjectException (timed out after 30 seconds, waiting for #<Watir::Div: located: false; {:css=>".review-body-text", :index=>10, :tag_name=>:div}> to be located; Maybe look in an iframe?):

我的代码:

while  browser.element(:text => "Next Page").present?
browser.elements(css:'.review-body-text').each do |comment|
review= Review.new
review.text=comment.text
product.reviews<<review
review.save
end
browser.button(:text => "Next Page").click
end while  browser.element(:text => "Next Page").present?
browser.close

加载下一页评论是异步完成的。这可能会导致在评论正在更改过程中尝试阅读评论。单击分页按钮后,您需要等待评论列表完成加载。

可能有许多方法可以检测到这一点。下面的示例等待分页控件更新为新的页码。

paginator_list = browser.ul(class: 'paginator-list')
last_page = paginator_list.button(aria_label: true, index: -1).text.to_i
1.upto(last_page) do |i|
browser.divs(class: 'review-body-text').each do |comment|
review= Review.new
review.text=comment.text
product.reviews<<review
review.save
end
unless i == last_page
browser.button(text: 'Next Page').click
browser.wait_until do
current = paginator_list.button(class: 'active').text.to_i
current == i + 1
end
end
end

实际上"下一页"文本不在按钮中,而是在跨度中, 所以编写代码

while b.span(:text => "Next Page").present?
b.elements(css: '.review-body-text').each do |comment|
p comment
end
b.span(text: "Next Page").click
end

它会为你工作。

def get_all_reviews
loop do
# Call method to get reviews on page     
break unless b.span(:text => "Next Page").present?
b.span(text: "Next Page").click
end
end

我认为 Rubys 循环确实中断更适合这种操作。

我还建议你为这些元素分配变量,以使代码更易于阅读,如下所示:

def get_all_reviews
loop do
# Call method to get reviews on page     
break unless next_page.present?
next_page.click
end
end

最新更新