В Ruby, с селеном, сложно нажать на Google Search - PullRequest
0 голосов
/ 29 декабря 2018

Я дошел до этого, открыв браузер Firefox, перейдя в Google и найдя поисковый элемент Google

irb(main):001:0> require 'selenium-webdriver'
=> true

irb(main):002:0> driver = Selenium::WebDriver.for:firefox
=> #<Selenium::WebDriver::Firefox::Marionette::Driver:0x..fb3c81796cc82b708 browser=:firefox>

irb(main):003:0> driver.navigate().to("http://www.google.com")
=> nil

irb(main):188:0> driver.find_element(:name, "q").send_keys "fff"
=> nil    

irb(main):112:0> driver.find_element(:name, "btnK");
=> #<Selenium::WebDriver::Element:0x5fb450f4379c50ce id="d767311c-27a2-3544-8f11-e4edc9736588">

irb(main):113:0> driver.find_element(:name, "btnK").attribute('value');
=> "Google Search"

Но мне не удалось щелкнуть по нему!

irb(main):114:0> driver.find_element(:name, "btnK").click
Traceback (most recent call last):
       16: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/w3c/bridge.rb:552:in `execute'
       15: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/bridge.rb:166:in `execute'
       14: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:62:in `call'
       13: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/default.rb:104:in `request'
       12: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `create_response'
       11: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `new'
       10: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
        9: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
        8: from clickElement@chrome://marionette/content/listener.js:1209:5
        7: from navigate@chrome://marionette/content/listener.js:409:13
        6: from navigate/<@chrome://marionette/content/listener.js:410:13
        5: from clickElement/<@chrome://marionette/content/listener.js:1210:14
        4: from interaction.clickElement@chrome://marionette/content/interaction.js:130:11
        3: from webdriverClickElement@chrome://marionette/content/interaction.js:159:11
        2: from ElementNotInteractableError@chrome://marionette/content/error.js:286:5
        1: from WebDriverError@chrome://marionette/content/error.js:178:5
Selenium::WebDriver::Error::ElementNotInteractableError (Element <input name="btnK" type="submit"> could not be scrolled into view)
irb(main):115:0> 

Это говорит о том, что элемент "не может быть прокручен в поле зрения"!

Я могу сделать driver.find_element(:tag_name, "body").send_keys :page_down;, что приведет к перебоям вниз.Что упомянуто? Смотрите документацию по селену ruby ​​для send_keys https://www.rubydoc.info/gems/selenium-webdriver/Selenium%2FWebDriver%2FElement%3Asend_keys.Я вижу список кодов клавиш https://www.rubydoc.info/gems/selenium-webdriver/Selenium/WebDriver/Keys#KEYS-constant.А также в списке https://github.com/SeleniumHQ/selenium/blob/master/rb/lib/selenium/webdriver/common/keys.rb.Или я могу страницу вниз вручную.Но прокрутка (по крайней мере, в обычном смысле этого слова), кажется, не проблема, я все еще получаю эту ошибку.Может быть, это в кадре, к которому я могу переключиться, и я не знаю, к какому.

Кнопка, конечно, видна.Это просто обычная страница поиска в Google.

Я могу найти кнопку в порядке, но не вижу, как нажать на нее, так как .click не работает для меня.

добавлено

в ответ на комментарий, спрашивающий меня, не скрывает ли окно предложений Google кнопку.В браузере я вижу, что кнопка не запутана, потому что иногда я выполнял escape вручную или щелкал фоновое окно (чтобы избавиться от этого. Я использую IRB, поэтому каждый оператор выполняется вручную, поэтому у меня есть время, чтобы это сделать).Но я также сбежал с кодом, и escape работает, чтобы избавиться от окна предложения, но все равно та же ошибка при попытке нажать кнопку

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018

Это то, что я сказал вам использовать WATIR. Если бы вы использовали WATIR, эта проблема не возникла бы.Проблема в вашем коде, это не ожидание видимости.Недавно в Chrome Driver также добавлено неявное ожидание щелчка, поэтому оно будет ожидать отображения, если вы установите неявное ожидание.В противном случае перейдите к WATIR, который является хорошей оболочкой, которая не ожидает через драйвер. В WATIR ожидание состояния элемента происходит из привязки на местном языке, поэтому используйте этот код селена

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = 10
driver.navigate().to("http://www.google.com")
driver.find_element(:name, "q").send_keys "fff"
driver.find_element(:name, "btnK").click

Помните, что этот код селена не будетработать для Firefox, потому что неявное ожидание клика еще не добавлено для Firefox.

Поскольку WATIR обрабатывает синхронизацию с привязкой к локальному языку, не имеет значения, используете ли вы Chrome или Firefox, он будет прекрасно работать

Код WATIR (по умолчанию Chrome)

require 'watir'
b=Watir::Browser.new
b.goto 'www.google.com'
b.text_field(name: 'q').set 'fff'
b.button(name: 'btnK').click

Если вы хотите управлять Firefox

b=Watir::Browser.new :firefox
0 голосов
/ 29 декабря 2018

Обсуждая эту проблему в комментариях, я написал некоторый код C #, чтобы продемонстрировать, как мы ждем кликабельности в C #

new WebDriverWait(Driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementToBeClickable(By.Name("btnK"))).Click();

В процессе написания кода на C #, который я разместил, я думаю, что вижупроблема в том.Когда вы начинаете вводить текст в поле поиска, появляется раскрывающийся список, в котором содержатся предлагаемые варианты поиска.Это касается кнопки «Поиск Google», которую вы пытаетесь нажать ... НО другая кнопка «Поиск Google» появляется в нижней части самого раскрывающегося списка.Вы должны напечатать счетчик элементов (:name, "btnK") ... Я предполагаю, что он напечатает 2 (если будет добавлено правильное ожидание).Оттуда вам просто нужно нажать на тот, который находится сверху.

Другой вариант - отправить \ r \ n в конце строки поиска и избежать всей этой проблемы ... или вы могли быпросто перейдите к окончательному поисковому URL и сэкономьте еще больше головной боли и времени.

Добавлена ​​заметка из штопора

Чтобы пояснить, это не имеет никакого отношения к всплывающему окну подсказок, показывающему(и необходимость избавиться от всплывающего окна) .. и не имеет ничего общего с ожиданием (так как я работал с IRB, я естественно ждал).И я уже щелкнул снаружи или нажал клавишу «Побег», чтобы избавиться от всплывающего окна.Проблема была, и ответ Джеффа предупредил меня об этом - даже после того, как всплывающее окно исчезло, все еще есть две кнопки с этим именем btnK.Таким образом, использование find_elements вместо find_element и запуск .click на втором работает!(Также использование find_elements (множественное число) для атрибута имени имеет смысл, поскольку, как отмечено в ответе здесь /4891030/dolzhen-li-atribut-name-byt-unikalnym-v-dokumente-html., атрибут имени не является уникальным / не уникальным идентификатором.

0 голосов
/ 29 декабря 2018

Но вы можете сделать клик с помощью javascript (отправив javascript в браузер).

b=driver.find_element(:name, "btnK")

driver.execute_script("arguments[0].click();",b)

Джефф объясняет, почему метод javascript (селен с javascript) работает с любой кнопкой, но не с javascript.(Селен без JavaScript) работает только на одну кнопку, он написал «Обе кнопки будут работать, щелчок JS будет нажимать на любой элемент, независимо от того, где он находится ... или если он виден и т. д. Selenium был разработан для взаимодействия сстраница, как пользователь, поэтому она не смогла нажать на элемент из-за ошибки. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...