如何在 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