使用带有 Selenium 的 Mozilla Marionette Web 驱动程序时如何禁用 Web 驱动程序异常
How can I disable Web Driver Exceptions when using the Mozilla Marionette web driver with Selenium
我正在使用 Python 和 Selenium 远程控制 Firefox 浏览器。我已按照 mozilla developer site 上的指示改用 Marionette。一切正常。
有一页,当我想要 select 一个元素时。我得到一个例外。我认为这是一个 Javascript 警告导致驱动程序陷入困境。有谁知道如何让驱动程序对 Javascript 错误不那么挑剔?另外有谁知道哪里有 Python Marionette 客户端的综合文档?
抱歉,我无法使代码完全可重现,因为这是一个客户的私人网站,我正试图从中 select 一个元素。
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
谢谢
先回答你的第二个问题,this documentation 似乎比较全面;这符合您的需求吗?
至于如何禁用WebDriverException
的问题,我唯一知道的就是使用try:
except:
块,但我认为这不会一个好主意。 WebDriverException
是 webdriver 使用的基本异常,它会捕获所有错误,包括您正在使用的 NoSuchElementException
。
我不知道有什么方法可以专门捕获 JavaScript 错误,因为这些错误似乎冒出 WebDriverException
秒。我假设因为您问的是这个问题,所以修复 JavaScript 本身不是一种选择?
您可以尝试的一件事是使用网络驱动程序的 get_log()
method。据我所知,JS 错误应该在该方法返回的结果中可见。您可以尝试调用 browser.get_log(log_type)
(其中 log_type
是 'browser'
、'client'
、'driver'
或 'server'
之一,具体取决于错误的来源)在您的 Select()
调用之前,解析该数据,然后采取相应的行动。
版本 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')
我正在使用 Python 和 Selenium 远程控制 Firefox 浏览器。我已按照 mozilla developer site 上的指示改用 Marionette。一切正常。
有一页,当我想要 select 一个元素时。我得到一个例外。我认为这是一个 Javascript 警告导致驱动程序陷入困境。有谁知道如何让驱动程序对 Javascript 错误不那么挑剔?另外有谁知道哪里有 Python Marionette 客户端的综合文档?
抱歉,我无法使代码完全可重现,因为这是一个客户的私人网站,我正试图从中 select 一个元素。
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
谢谢
先回答你的第二个问题,this documentation 似乎比较全面;这符合您的需求吗?
至于如何禁用WebDriverException
的问题,我唯一知道的就是使用try:
except:
块,但我认为这不会一个好主意。 WebDriverException
是 webdriver 使用的基本异常,它会捕获所有错误,包括您正在使用的 NoSuchElementException
。
我不知道有什么方法可以专门捕获 JavaScript 错误,因为这些错误似乎冒出 WebDriverException
秒。我假设因为您问的是这个问题,所以修复 JavaScript 本身不是一种选择?
您可以尝试的一件事是使用网络驱动程序的 get_log()
method。据我所知,JS 错误应该在该方法返回的结果中可见。您可以尝试调用 browser.get_log(log_type)
(其中 log_type
是 'browser'
、'client'
、'driver'
或 'server'
之一,具体取决于错误的来源)在您的 Select()
调用之前,解析该数据,然后采取相应的行动。
版本 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')