如何在使用Selenium的Mozilla Marionette Web Driver时禁用Web Driver异常?

3
我正在使用Python和Selenium远程控制Firefox浏览器。根据mozilla开发者网站的指示,我已经切换到使用Marionette,并且一切正常。
但是,在一个页面上当我想选择一个元素时,会出现异常。我认为这可能是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

谢谢

2个回答

1

发布版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')

通过:

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

谢谢,这修复了代码因为异常而失败的问题。但是我仍然有一个奇怪的问题,就是 "select_by_visible_text" 不会选择选项。如果我更改文本,那么它就会失败,但似乎驱动程序告诉 Firefox 选择该元素的尝试没有得到响应。我将不得不尝试更多的调试。 - Dan
@Dan,我也曾遇到原生下拉列表的一些问题。我不得不使用一些JavaScript选择<OPTION>并触发change事件:.executeScript("var e=arguments[0]; e.selected=true; e.dispatchEvent(new Event('change'));", option); - Florent B.
谢谢Florent,我可能会尝试一下。目前我只是切换到使用Chrome。 - Dan

0

先回答你的第二个问题,这份文档看起来相当全面,是否满足你的需求?

至于如何禁用WebDriverException的问题,我所知道的唯一方法是使用try:except:块,但我认为这不是一个好主意。WebDriverException是webdriver使用的基本异常,它会捕获所有错误,包括你正在使用的NoSuchElementException

我不知道有什么特定的方法可以捕获JavaScript错误,因为它们似乎会作为WebDriverException冒泡出现。我假设你之所以问这个问题,是因为修复JavaScript本身不是一个选项吗?

您可以尝试使用webdriver的get_log()方法。根据我所读的,JS错误应该在此方法返回的结果中可见。您可以在Select()调用之前调用browser.get_log(log_type)(其中log_type'browser''client''driver''server'之一,具体取决于错误发生的位置) ,解析数据,然后相应地采取行动。


感谢Elethan,Florent的答案修复了异常,但它仍然没有选择选项。我将尝试使用get_log来查看为什么未选择该选项是否提供任何见解。 - Dan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接