3

我使用Python和Selenium远程控制Firefox浏览器。我已转向使用木偶,如mozilla developer site所指示的那样。这一切都很好。如何在Selenium中使用Mozilla Marionette Web驱动程序时禁用Web驱动程序例外

有一个页面,当我想选择一个元素。我得到一个异常。我认为这是一个Javascript警告,导致司机bork。有谁知道我能如何让驾驶员对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 

感谢

回答

1

版本3.0.0-beta-3中存在一个可阻止使用get_attribute的错误。所以,你可以恢复到3.0.0-β-2或者您可以通过编辑自己的文件修复bug:

在文件 /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') 
+0

谢谢,它修复了通过例外失败的代码。我仍然有一个奇怪的问题,因为“select_by_visible_text”实际上不会选择一个选项。如果我改变文本,那么它会失败,但似乎驱动程序试图告诉Firefox选择元素没有通过。我将不得不尝试更多的调试。 – Dan

+0

@丹,我也遇到了本地下拉列表中的一些问题。我不得不选择

+0

谢谢Florent,我可以试试。目前我只是转而使用Chrome – Dan

0

先回答你的第二个问题,this documentation似乎相当全面;这是否符合您的需求?

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

我不知道有什么方法可以专门捕捉JavaScript错误,因为这些错误似乎冒泡为WebDriverException s。我认为,因为你问这个问题,修复JavaScript本身不是一个选择?

你可能会尝试的一件事是使用webdriver的get_log() method。从我读过的,JS错误应该在这个方法返回的结果中可见。在调用Select()之前,您可以尝试拨打browser.get_log(log_type)(其中log_type'browser','client','driver''server'之一,具体取决于错误来源),然后解析该数据并进行相应的操作。

+0

谢谢Elethan,Florent的答案解决了这个例外,尽管它仍然没有选择这个选项。我将尝试使用get_log来查看它是否提供了有关未选择选项的原因。 – Dan

相关问题