Есть ли способ определить, можно ли щелкнуть по элементу в браузере Chrome, используя Selenium и Watir? - PullRequest
0 голосов
/ 01 июня 2018

Насколько я понимаю, этот вопрос действительно актуален только при выполнении автоматизации веб-тестирования с использованием браузера Chrome из-за способа реализации события нажатия с помощью Selenium Webdriver и Chromedriver.В качестве предисловия я использую и знаю, как найти элемент с помощью функции элемента Watir «присутствует?», Которая, как я понимаю, по сути является комбинацией «видимого?»и "существует?"Я также мог бы, при необходимости, найти элемент с функциями элемента Webdriver, чтобы определить, присутствует ли элемент с спасением для исключения, если это не так.Я пытаюсь определить следующее:

Иногда из-за недостаточной отзывчивости к странице будут найдены элементы страницы, которые пройдут все проверочные тесты на наличие, но не смогут активнона самом деле будет взаимодействовать из-за вышеупомянутого отсутствия отзывчивости страницы.При использовании браузера Chrome (с Chromedriver) попытки взаимодействия с этими элементами приведут к ошибке:

irb (основной): 003: 0> @ browser.button (: id, "button_login").подарок?=> true irb (main): 004: 0> @ browser.button (: id, "button_login"). Нажмите Selenium :: WebDriver :: Error :: UnknownError: unknown error: Элемент ... неактивен в точке (915, nt получит щелчок:

(информация о сеансе: chrome = 66.0.3359.181) (информация о драйвере: chromedriver = 2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb), платформа = Windows NT 6.3.9600 x86_64)C: /Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/response.rb: 69: в «assert_ok» из C: / Ruby23 / lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/response.rb:32:in 'инициализировать' из C: /Ruby23/lib/ruby/gems/2.3.0 / gems / selenium-webdriver-3.4.4 / lib / selenium / webdriver / remote / http / common.rb: 83: в «новом» из C: /Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/common.rb:83:in 'create_response' из C: /Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4 / lib / selenium / webdriver / remote / http / default.rb: 107: в запросеst 'из C: /Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/http/common.rb: 61: в «вызове» из C: /Ruby23/lib/ruby/gems/2.3.0/gems/selenium-webdriver-3.4.4/lib/selenium/webdriver/remote/bridge.rb: 170: в «выполнить» из C: / Ruby23 / lib /ruby / gems / 2.3.0 / gems / selenium-webdriver-3.4.4 / lib / selenium / webdriver / remote / oss / bridge.rb: 579: в "выполнить" из C: / Ruby23 / lib / ruby ​​/ gems /2.3.0 / gems / selenium-webdriver-3.4.4 / lib / selenium / webdriver / remote / oss / bridge.rb: 328: в 'click_element' из C: /Ruby23/lib/ruby/gems/2.3.0/gems / selenium-webdriver-3.4.4 / lib / selenium / webdriver / common / element.rb: 74: в «клик» из C: /Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1 / lib / watir / elements / element.rb: 131: в блоке «клик» из C: /Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1/lib/watir/elements/element.rb: 656: в «element_call» из C: /Ruby23/lib/ruby/gems/2.3.0/gems/watir-6.4.1/lib/watir/elements/element.rb: 122: в «клике»из (irb): 4 из C: /Ruby23/bin/irb.cmd: 19: в ''

Я знаю, что могу спасти в этот момент, но это означает, что я фактически щелкаю по элементу.По сути, я хочу написать специальную функцию "кликабелен?"это вернет логический вывод без фактического щелчка по элементу и, возможно, перехода от страницы.Я бы предпочел не пытаться делать это с типом --ctrl + click, если новое окно вернет true, закроет окно, установит фокус на первое окно, rescue вернет false-- рабочий процесс

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Watir 6.15.0 +

Element#obscured? был добавлен для проверки этого сценария.Теперь вы можете сделать:

browser.element(id: 'target').wait_while(&:obscured?).click

Watir pre-6.15.0

Для более старых версий вам потребуется другой подход.

Я бы попытался подождать, пока перекрывающийся элемент исчезнет.Если перекрытие является чем-то вроде наложения, которое в конечном итоге исчезнет, ​​это относительно просто - например:

browser.element(id: 'overlapping_element').wait_while(&:present?)

Если перекрывающийся элемент перемещается, а не исчезает, или вы не знаете перекрывающийся элемент, вы можете попробоватьаппроксимируя проверку перекрывающихся элементов.Когда Chrome щелкает элемент, он получает его центральное положение и затем щелкает в этой точке.Если элемент верхнего уровня в этой точке не является вашим элементом, возникает исключение.Следующее ожидание выполнит эту проверку, пока не будет перекрывающегося элемента:

target = browser.button
target_children = target.elements.to_a
browser.wait_until do
  location = target.location
  size = target.size
  center = [location.x + size.width/2, location.y + size.height/2]
  element_at_point = browser.execute_script("return document.elementFromPoint(#{center[0]}, #{center[1]});")
  [target, target_children].flatten.include?(element_at_point)
end
target.click

Обратите внимание, что мне раньше не приходилось делать это, поэтому я не знаю, есть ли крайние случаи.Похоже, работает с Chrome и Firefox.

0 голосов
/ 01 июня 2018

Я могу предложить вам подождать, пока эта кнопка не появится на веб-странице.У меня возникла та же проблема (я использовал XPath в своих тестах).Чтобы исправить это:

Сначала я определил 2 вспомогательных метода, потому что мне приходилось их много использовать.Один для поиска точного элемента на странице (этот метод обычно занимает некоторое время, чтобы вернуть результат, поэтому вам не нужно sleep браузер), а другой - для нажатия кнопки с указанным «id».

module Helpers
  module Common
    def wait_for_element_id(value)
      find(:xpath, "(//*[@id='#{value}'])[1]")
    end

    def click_button_with_id(value)
      first(:xpath, "//button[@id='#{value}']").click
    end
  end
end

После этого в своем тесте вы можете использовать вспомогательные методы, такие как:

it 'clicks on the login button and magic is executed' do
  logout(user)
  wait_for_element_id('button_login')
  click_button_with_id('button_login')

  expect(magic).to be_executed
end

Я также не уверен, но вы также можете испытать тот же проект из-за размера окна браузера (кнопкане показывается из-за слишком малого размера) или из-за «безголового» режима ваших тестов.

...