3

Python と Selenium を使用して Firefox ブラウザをリモート コントロールしています。mozilla 開発者サイトの指示に従って、Marionette の使用に切り替えました。それはすべてうまくいきます。

要素を選択するページが 1 つあります。例外があります。ドライバーが機能しなくなるのは 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

ありがとう

4

2 に答える 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')
于 2016-09-16T17:56:15.807 に答える
0

最初に 2 番目の質問に答えると、このドキュメントはかなり包括的です。これはあなたのニーズを満たしていますか?

を無効WebDriverExceptionにする方法の問題については、ブロックを使用することしか知りtry: except:ませんが、これは良い考えではないと思います。WebDriverExceptionは webdriver が使用する基本例外であり、使用している を含むすべてのエラーをキャッチしNoSuchElementExceptionます。

JavaScript エラーは sとしてバブルアップするように見えるため、JavaScript エラーを具体的にキャッチする方法はわかりませんWebDriverException。この質問をしているので、JavaScript自体を修​​正することは選択肢ではないと思いますか?

あなたが試すかもしれないことの1つは、webdriverのget_log()メソッドを使用することです。私が読んだことから、このメソッドによって返される結果に JS エラーが表示されるはずです。browser.get_log(log_type)呼び出しの前に(log_type'browser''client''driver'、または'server'エラーの発生場所に応じて ) をSelect()呼び出して、そのデータを解析し、それに応じて行動することを試みることができます。

于 2016-09-16T12:57:27.260 に答える