Как закончить поиск элементов в watir? - PullRequest
0 голосов
/ 03 октября 2018

Я должен сохранить все отзывы со страницы 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

Ответы [ 3 ]

0 голосов
/ 04 октября 2018
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 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
0 голосов
/ 04 октября 2018

Загрузка следующей страницы отзывов осуществляется асинхронно.Это может привести к попытке прочитать отзывы, пока они находятся в процессе изменения.После нажатия кнопки подкачки вам нужно дождаться окончания загрузки списка отзывов.

Вероятно, есть несколько способов обнаружить это.В следующем примере ожидается обновление элемента управления подкачкой до нового номера страницы.

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
0 голосов
/ 03 октября 2018

На самом деле текст «Следующая страница» находится не в кнопке, а в промежутке, поэтому напишите код

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

Это будет работать для вас.

...