如何在 watir 完成对元素的搜索?
How to finish searching for elements at watir?
我应该保存页面 https://www.walmart.com/ip/Ematic-9-Dual-Screen-Portable-DVD-Player-with-Dual-DVD-Players-ED929D/28806789 中的所有评论。为此,我使用 Watir,因为它是动态页面,我需要单击按钮来更新结果。我检查按钮是否存在,然后在所有评论都保存在最后一页时抓取 reviews.But,它没有完成过程并搜索元素,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
实际上 'Next Page' 文本不在按钮中,它在 span 中,所以写代码
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 loop do break更适合这种操作。
我还建议您为这些元素分配变量以使代码更易于阅读,如下所示:
def get_all_reviews
loop do
# Call method to get reviews on page
break unless next_page.present?
next_page.click
end
end
加载下一页评论是异步完成的。这可能会导致在更改过程中尝试阅读评论。点击分页按钮后,需要等待评论列表加载完成。
可能有多种方法可以检测到这一点。以下示例等待分页控件更新为新的页码。
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
我应该保存页面 https://www.walmart.com/ip/Ematic-9-Dual-Screen-Portable-DVD-Player-with-Dual-DVD-Players-ED929D/28806789 中的所有评论。为此,我使用 Watir,因为它是动态页面,我需要单击按钮来更新结果。我检查按钮是否存在,然后在所有评论都保存在最后一页时抓取 reviews.But,它没有完成过程并搜索元素,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
实际上 'Next Page' 文本不在按钮中,它在 span 中,所以写代码
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 loop do break更适合这种操作。
我还建议您为这些元素分配变量以使代码更易于阅读,如下所示:
def get_all_reviews
loop do
# Call method to get reviews on page
break unless next_page.present?
next_page.click
end
end
加载下一页评论是异步完成的。这可能会导致在更改过程中尝试阅读评论。点击分页按钮后,需要等待评论列表加载完成。
可能有多种方法可以检测到这一点。以下示例等待分页控件更新为新的页码。
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