Watir-WebDriver; изменение поведения метода из-за изменения размера окна?

Я использую rspec-watir для автоматизации некоторых тестов, и недавно у меня возникла странная проблема.
Фон: у меня есть метод, который называется select_cards(cards) создан, который выполняет поиск, выбирает 16 (в частности, 16) карт, затем добавляет их в раздел... недавно я изменил свою конфигурацию, чтобы окно экрана начиналось с 1920x1080 (@browser.window.resize_to(1920, 1080))

Так как я делаю это всякий раз, когда я бегу select_cards(cards) он выбирает только 12 карт вместо 16. Однако, когда я закомментирую window.resize_to метод, он успешно захватывает все 16

Любая идея, почему изменение размера окна может вызвать изменение поведения? Любые мысли о том, как я мог бы обойти это?

Фрагмент кода для того, как select_cards(cards) работает:

def select_cards(cards)
    @browser.button(:class, 'add-cards').click
    # this runs a generic search to return all cards
    search_modal = @browser.div(:class, 'quick-search')     
    search_modal.button(:class, 'test-quick-search').click

    results = @browser.div(:class, 'search-results')

    # This #take() passes in how many cards to click on--as stated; 16
    cards = results.divs(:class, 'card selectable')
    cards.take(cards).each do |assets|
        assets.click
    end
end

3 ответа

Я также сталкивался с подобной проблемой, когда элементы не находятся в режиме прокрутки. В этих ситуациях я использовал гем "watir-nokogiri", чтобы проанализировать html, а затем захватить все элементы и выполнить действие, если они являются уникальным идентификатором для захваченных элементов. В вашей ситуации я бы сделал что-то вроде этого:

def select_cards(cards)
  @browser.button(:class, 'add-cards').click
  search_modal = @browser.div(:class, 'quick-search')     
  search_modal.button(:class, 'test-quick-search').click 

  # Parsing HTML into a variable and searching for the results inside the variable
  doc = WatirNokogiri::Document.new(@browser.html)
  results = doc.div(:class, 'search-results') 

  cards = results.divs(:class, 'card selectable')

  cards.take(cards).each do |assets|
    # Assuming that id is the unique identifier for the assets
    @browser.element(:id => "#{assets.id}").click
  end
end

ПРИМЕЧАНИЕ: это обходной путь, который я использовал для решения этих ситуаций, и он работает только в том случае, если я могу взаимодействовать с браузером, используя захваченный HTML. Если у вас нет идентификатора, вы можете попробовать с индексом или другим способом щелкнуть по нему. Используя эту библиотеку, вы сможете получить все элементы, даже если они не находятся в режиме прокрутки.

Это всего лишь предположение. Но возможно, что элементы не существуют, когда они не прокручиваются в поле зрения (или, возможно, имеют другие DOM)

Попробуйте прокрутить страницу (вместо изменения размера), например:

browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Как ни странно, я нашел кое-что, что, кажется, работает для меня:
После использования этих элементов Locating без определенного имени класса, чтобы я мог использовать другой метод, я изменил свой цикл на использование assets.fire_event ("onclick")
Я тестировал код несколько раз, и у меня не было проблем с выбором всех элементов

Другие вопросы по тегам