Selenium 3 Firefox .click() не работает

#python-3.x #firefox #selenium-webdriver #geckodriver #selenium3

#python-3.x #firefox #selenium-webdriver #geckodriver #selenium3

Вопрос:

Поскольку я обновился до новейшей версии Selenium, мой драйвер Firefox не работает должным образом. Не удается найти ответ при поиске в Google / Stack Я надеюсь, что у кого-то здесь есть ответ.

Я создал объектную модель страницы для входа на веб-страницу, перехода на сайт администратора и заполнения имени пользователя / пароля отправки. Этот код был написан для Selenium 2.53.6, но все еще работает для IE и Chrome. Часть, которая не работает для меня, — это эта строка кода:

 driver.find_element_by_xpath(locators["login.open"]).click()
 

Локатор:

 locators["login.open"] = "//*[@href='//www.phptravels.net/admin']"
 

Поскольку он работает в IE и Chrome, меня озадачивает, что Firefox больше не .click() может?

Я не получаю сообщение об ошибке в своей консоли, оно просто не нажимает кнопку admin-site. Может ли это быть связано с данной версией Firefox для Selenium 3 / geckodriver?

Все драйверы обновлены с помощью pip

Я использую этот сайт для отработки моего Selenium: http://phptravels.com/demo /

Редактировать (1): я пробовал с версиями Firefox 48 и 49 — все еще не работает

Редактировать (2): geckodriver настроен с объявленными двоичными файлами Firefox, однако драйвер по-прежнему не выполняет .click()

 from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

binary = FirefoxBinary('path/to/binary')
driver = webdriver.Firefox(firefox_binary=binary)
 

Редактировать (3): я проверяю, присутствует ли элемент в локаторе xpath, используя is_displayed(), и он возвращается True . Итак, я знаю, что он может найти элемент.

Редактировать (4): 1) Пробовал с ночной сборкой, как предлагалось, не работает. 2) Пробовал с помощью find_element_by_link_text, также не работает. 3) Пробовал различные версии geckodriver (10.0, 11.0, 11.1 для 32 и 64 бит во всех версиях)

Edit (5): «Контейнер плагинов для Firefox перестал работать» появляется последовательно каждый раз, когда тестовый пример завершается неудачно.

Редактировать (6): возможное решение проблемы: я провел еще один тест на другом веб-сайте, и Firefox успешно выполняет .click() . На первой целевой веб-странице, где .click() терпит неудачу, находится огромный javascript, который запускается при открытии страницы. Это может повлиять на способность geckodriver выполнять .click() на страницах с большим объемом javascript.

Редактировать (7): использование .send_keys(ключи.ВОЗВРАТ) с помощью библиотеки ключей работает, но может потребоваться дополнительная перенастройка, если вы используете POM. Явное выполнение time.sleep поможет вам, но пока все еще сложно использовать Selenium 3 Firefox / geckodriver для автоматизации веб-браузера. Понизьте версию до последней стабильной версии (2.53.6), если вам нужно протестировать Firefox (примечание: новейшие версии Firefox не будут работать).

Комментарии:

1. У меня такая же проблема (но с использованием Java). С момента обновления до версии v3 я столкнулся с несколькими подобными проблемами с geckodriver. Похоже, что некоторые ссылки можно щелкнуть таким образом, в то время как другие отказываются нажиматься. Я добился некоторого успеха, используя xpath, такой как //a[text()=’linktext’] вместо.linkText , но это не согласуется. Нет способа API узнать, удался ли щелчок или нет.

2. Я тоже вижу эту проблему (в C #) после обновления до selenium 3.

3. RE: Редактировать # 6. Что произойдет, если вы выполните поток. Спящий режим (10000) перед щелчком, чтобы страница успокоилась или что-то еще. Просто в качестве меры по устранению неполадок…

4. Я пробовал это, но не сработало. Но спасибо за предложение. Иногда это действительно помогает, но не в этом случае. У меня также есть неявное ожидание для всех элементов, и я стараюсь воздерживаться от явных ожиданий, поскольку это замедлило бы мой тест больше, чем нужно

5. У меня такая же ошибка при использовании Python 2.7 с Selenium 3.0.2 и драйвером gecko 0.11 и Firefox Developer Edition 52.0a2. Моя прогулка: gist.github.com/mpasternak/f2840edea51c211d609daa7f17be614f . Я вызываю jQuery, чтобы щелкнуть элемент, таким образом, его не нужно прокручивать в поле зрения, а затем я игнорирую какую-то ошибку марионетки, когда она пытается получить возвращаемое значение из javascript. На самом деле, предыдущие Firefoxes зависают, когда моя библиотека Selenium (Splinter) пытается открыть URL-адрес «about: blank» таким образом…

Ответ №1:

У меня такая же проблема, но иногда .click работает, а иногда нет. Для меня это плохо справляется с переключением на недавно открытые окна, и несколько других причуд приводят к сбою тестов, которые прошли в Selenium 2.53.4 и которые проходят с Selenium 3 в Chrome, Safari и IE в FireFox. Я знаю, что это не очень конкретно, но я уже опубликовал поиск конкретных вопросов в другом месте.

Я использую Ruby / Selenium / Capaybara. После тщательного тестирования с использованием комбинации Selenium 3 / Geckodriver / FF49 я вернулся к Selenium 2.53.4 / FF47.01. У меня сложилось впечатление, что комбинация Selenium 3 / Geckodriver еще не совсем стабильна, что может включать или не включать совместимость Capybara с Geckodriver. Я бы хотел ошибаться. Я искал в Интернете любую полезную информацию и не нашел ее.

Однако я нашел эту заметку из объявления в блоге выпуска Selenium 3: «Mozilla была лидером в реализации протокола W3C WebDriver. С положительной стороны, это выявило проблемы со спецификацией по мере ее развития, но это также означает, что поддержку Firefox трудно отследить, поскольку их инженерные усилия были направлены на перспективу, а не на поддержку текущего проводного протокола, используемого Selenium WebDriver. На данный момент лучший совет, который мы можем предложить, — это попробовать последнюю версию geckodriver и Selenium вместе. »

Ответ №2:

Может быть эта ошибка?

Через неделю я отключаю marionette (java):

capability.setCapability("marionette", false);

Это все восстанавливает. Не спрашивайте меня, почему.

Комментарии:

1. Эта ошибка сделана мной :-). Я давно перешел. если кто-то может подтвердить, что отключение marionette работает, я одобрю ваш ответ.

Ответ №3:

Я использовал версии 0.11.1 для GeckoDriver и v3.0 для Selenium, и у меня была та же проблема. Мой обходной путь состоял в том, чтобы пройти мимо.XPath вместо By.linkText для findElement . Как упоминал OP, при поиске элемента я получал «true», по какой-то причине он просто не обрабатывал щелчок по нему.

  driver.FindElement(By.XPath("//something")).Click();
 

Комментарии:

1. Я также использую Xpath и так же, как и вы. Странно, что это не работает. Вы используете 32- или 64-разрядный geckodriver?

2. @MSJ 64-разрядный сэр

3. Для меня это то же самое. Однако, согласно Edit (6), похоже, что geckodriver не может обрабатывать некоторые страницы с определенным типом javascript. На веб-странице, которую я тестирую, в правом нижнем углу есть всплывающая функция чата. Я подозреваю, что это связано с geckodriver

4. @MSJ Интересная теория. На наших страницах у нас есть сторонний виджет js overlay под названием WalkMe.js . Я выяснил, как уничтожить и удалить его из DOM с помощью одной конкретной строки javascript, используя JavascriptExecutor . Возможно, именно поэтому это работает для меня? Попробуйте связаться с авторами виджета чата, чтобы узнать, есть ли для него команда уничтожения.

5. Я хочу добавить, что у меня есть похожая проблема «.Click () не работает», и я отправил отчет об ошибке для нее .. github.com/mozilla/geckodriver/issues/324

Ответ №4:

У меня сейчас те же проблемы, я попытался использовать сборку nightly, и она начала работать, хотя у меня возникли проблемы с попыткой щелкнуть вещи до того, как они будут готовы, но это скорее моя проблема, чем сам Selenium.

Текущая версия ночной сборки 52.0a1, вы можете найти ее здесь .

По умолчанию FirefoxDriver по-прежнему будет использовать вашу обычную установку Firefox, поэтому вам нужно будет создать драйвер, используя profile / options / binary, я делаю это так (на C #, но должно быть очень похоже на Python);

var binary = new FirefoxBinary(@"C:Program Files (x86)Nightlyfirefox.exe");
Driver = new FirefoxDriver(binary, null);

Я думаю, что это может быть FirefoxDriver(binary: binary) на Python, но не совсем уверен. Обратите внимание, что использование FirefoxBinary является устаревшим с Selenium 3 в пользу FirefoxOptions, но это позволит вам проверить, является ли это вашей проблемой на данный момент.

Комментарии:

1. Привет, Дилланм. Спасибо за ваш ответ. Я объявил двоичный файл Firefox в своем коде (согласно Edit (2)). Я обновил пример кода. Все еще не работает. Я жду обновления для geckdo / marionette, поскольку я думаю, что это может решить проблему

2. Вы пробовали это с ночной сборкой? @пользователь2782743

3. Я только что попробовал с ночной сборкой. Я объявил двоичные файлы для ночной сборки, но это все то же самое. Он не щелкает. Я даже пытался найти что-то еще, кроме того, что находит Chrome и IE, но все равно нет .click’ing

Ответ №5:

Я также сталкиваюсь с той же проблемой с selenium 3 FF, но могу работать с JS executor и Keys.RETURN или Keys.ENTER

С помощью JS Executor :

 WebElement button = driver.findElement(By.cssSelector("input[value=btn]"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", button);
 

С Keys.RETURN помощью или Keys.ENTER :

 driver.findElement(By.id("abc")).sendKeys(Keys.RETURN);
driver.findElement(By.id("abc")).sendKeys(Keys.ENTER);