Как отключить исключения веб-драйвера при использовании веб-драйвера Mozilla Marionette с Selenium

Я удаленно управляю браузером Firefox, используя Python и Selenium. Я перешел на использование Marionette, как указано на сайте разработчиков Mozilla< /а>. Это все работает нормально.

Есть одна страница, где я хочу выбрать элемент. Я получаю исключение. Я думаю, что это предупреждение Javascript, из-за которого драйвер не работает. Кто-нибудь знает, как я могу сделать драйвер менее придирчивым к ошибкам Javascript? Кроме того, кто-нибудь знает, где есть исчерпывающая документация по клиенту Python Marionette?

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

from selenium import webdriver

# see https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities.FIREFOX

# Tell the Python bindings to use Marionette.
# This will not be necessary in the future,
# when Selenium will auto-detect what remote end
# it is talking to.
caps["marionette"] = True
caps["binary"] = "/Applications/Firefox.app/Contents/MacOS/firefox-bin"

from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Firefox(capabilities=caps)
webdriver.Firefox.get_capabilities()
browser.implicitly_wait(3)

browser.get("https://www.example.com/examplepage")

saved_exports_field = browser.find_element_by_id('exportlist')
saved_exports_field_select = Select(saved_exports_field)

Вот где это идет не так. След выглядит следующим образом

---------------------------------------------------------------------------
WebDriverException                        Traceback (most recent call last)
<ipython-input-35-6e712759af43> in <module>()
      1 saved_exports_field = browser.find_element_by_id('exportlist')
----> 2 saved_exports_field_select = Select(saved_exports_field)
      3 #saved_exports_field_select.select_by_visible_text('test score export dan')

/Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/support/select.py in __init__(self, webelement)
     39                 webelement.tag_name)
     40         self._el = webelement
---> 41         multi = self._el.get_attribute("multiple")
     42         self.is_multiple = multi and multi != "false"
     43 

/Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py in get_attribute(self, name)
    134             attributeValue = self.parent.execute_script(
    135                 "return (%s).apply(null, arguments);" % raw,
--> 136                 self, name)
    137         else:
    138             resp = self._execute(Command.GET_ELEMENT_ATTRIBUTE, {'name': name})

/Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py in execute_script(self, script, *args)
    463         return self.execute(Command.EXECUTE_SCRIPT, {
    464             'script': script,
--> 465             'args': converted_args})['value']
    466 
    467     def execute_async_script(self, script, *args):

/Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/webdriver.py in execute(self, driver_command, params)
    234         response = self.command_executor.execute(driver_command, params)
    235         if response:
--> 236             self.error_handler.check_response(response)
    237             response['value'] = self._unwrap_value(
    238                 response.get('value', None))

/Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/errorhandler.py in check_response(self, response)
    190         elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
    191             raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
--> 192         raise exception_class(message, screen, stacktrace)
    193 
    194     def _value_or_default(self, obj, key, default):

WebDriverException: Message: SyntaxError: missing ) in parenthetical

Спасибо


person Dan    schedule 16.09.2016    source источник


Ответы (2)


В выпуске 3.0.0-beta-3 есть ошибка, которая не позволяет использовать get_attribute. Таким образом, вы можете либо вернуться к версии 3.0.0-beta-2, либо исправить ошибку, отредактировав файл самостоятельно:

В файле /Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py замените строку 133:

raw = pkgutil.get_data(__package__, 'getAttribute.js')

by:

raw = pkgutil.get_data(__package__, 'getAttribute.js').decode('utf8')
person Florent B.    schedule 16.09.2016
comment
Спасибо, это исправило сбой кода из-за исключения. У меня все еще есть странная проблема в том, что select_by_visible_text на самом деле не выбирает параметр. Если я изменю текст, это не удастся, но, похоже, попытки драйвера сказать Firefox выбрать элемент не проходят. Мне придется попробовать больше отладки. - person Dan; 19.09.2016
comment
@Dan, я также столкнулся с некоторыми проблемами с собственным раскрывающимся списком. Мне пришлось выбрать ‹OPTION› и запустить событие изменения с помощью JavaScript: .executeScript("var e=arguments[0]; e.selected=true; e.dispatchEvent(new Event('change'));", option); - person Florent B.; 19.09.2016
comment
Спасибо Флоран, я могу попробовать это. На данный момент я просто перешел на использование Chrome - person Dan; 20.09.2016

Чтобы сначала ответить на ваш второй вопрос, эта документация кажется достаточно исчерпывающей; это соответствует вашим потребностям?

Что касается вопроса о том, как отключить WebDriverException, единственное, что я знаю, это использовать блоки try: except:, но я не думаю, что это хорошая идея. WebDriverException — это базовое исключение, которое использует веб-драйвер, и оно будет перехватывать все ошибки, включая NoSuchElementException, которые вы используете.

Я не знаю какого-либо способа специально отлавливать ошибки JavaScript, поскольку они появляются как WebDriverExceptions. Я предполагаю, что, поскольку вы задаете этот вопрос, исправление самого JavaScript не является вариантом?

Вы можете попробовать использовать метод get_log() веб-драйвера. . Из того, что я прочитал, ошибки JS должны быть видны в результатах, возвращаемых этим методом. Вы можете попробовать вызвать browser.get_log(log_type) (где log_type — это одно из 'browser', 'client', 'driver' или 'server' в зависимости от того, откуда возникла ошибка) перед вызовом Select(), проанализировать эти данные и действовать соответствующим образом.

person elethan    schedule 16.09.2016
comment
Спасибо, Элетан, ответ Флорана исправил исключение, хотя он по-прежнему не выбирает опцию. Я попытаюсь использовать get_log, чтобы увидеть, дает ли он какое-либо представление о том, почему опция не выбрана. - person Dan; 19.09.2016