3

저는 Python과 Selenium을 사용하여 Firefox 브라우저를 원격 제어합니다. 나는 mozilla developer site의 지시대로 마리오네트를 사용하도록 전환했다. 그건 모두 잘 작동합니다.Selenium과 함께 Mozilla Marionette 웹 드라이버를 사용할 때 웹 드라이버 예외를 어떻게 비활성화 할 수 있습니까?

요소를 선택하려는 페이지가 하나 있습니다. 나는 예외를 얻는다. 나는 그것이 운전수에게 bork를 초래하고있는 Javascript 경고 다라고 생각한다. 누구나 내가 덜 자바 스크립트 오류에 대한 까다로운 드라이버를 만들 수있는 방법을 알고 있습니까? 또한 파이썬 마리오 네트 클라이언트의 포괄적 인 문서가있는 곳을 아는 사람이 있습니까?

죄송합니다. 요소를 선택하려고 시도하는 클라이언트의 개인 사이트이므로 코드를 완전히 재현 할 수 없습니다.

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로 되돌릴 수 있습니다 또는 당신이 파일을 직접 편집하여 버그를 수정할 수 있습니다에 의해

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

:

파일 /Users/dan/anaconda/envs/lt/lib/python3.5/site-packages/selenium/webdriver/remote/webelement.py에를 라인 (133)을 대체

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

고마워, 그 코드가 예외를 통해 실패했습니다. 나는 여전히 "select_by_visible_text"가 실제로 옵션을 선택하지 않는다는 것에 이상한 문제가있다. 필자가 텍스트를 변경하면 실패하지만 드라이버가 요소를 선택하도록 Firefox에서 알려주려고 시도하는 것으로 보이지 않습니다. 더 많은 디버깅을 시도해야 할 것입니다. – Dan

+0

@ Dan, 기본 드롭 다운 목록과 관련된 문제가 발생했습니다.

+0

Florent에게 감사 드려도 이의를 제기 할 수 있습니다. "#. 잠시 Chrome으로 전환했습니다. – Dan

0

을 다음과 같이 추적, this documentation 상당히 포괄적 인 것입니다; 이것이 당신의 필요를 충족 시키는가?

WebDriverException을 비활성화하는 방법에 대한 질문은 try:except: 개의 블록을 사용하는 것이지만, 좋은 생각이라고 생각하지 않습니다. WebDriverException은 웹 드라이버가 사용하는 기본 예외이며 사용중인 NoSuchElementException을 포함한 모든 오류를 catch합니다.

자바 스크립트 오류를 ​​특별히 잡을 방법이 없다는 것을 알고 있습니다. 자바 스크립트 오류는 WebDriverException으로 나타납니다. 나는 당신이이 질문을하기 때문에 JavaScript 자체를 수정하는 것이 선택이 아니라고 생각한다.

시도해 볼 수있는 한 가지 방법은 웹 드라이버의 get_log() method을 사용하는 것입니다. 읽은 것부터 JS 오류가이 메서드에서 반환 된 결과에 표시되어야합니다. Select() 호출 전에 해당 browser.get_log(log_type) (여기서 log_type'browser', 'client', 'driver' 또는 'server' 중 하나임)을 호출하여 해당 데이터를 구문 분석하고 이에 따라 조치를 취할 수 있습니다.

+0

감사합니다 Elethan, Florent의 대답으로 예외가 해결되었지만 아직 옵션을 선택하지 않았습니다. get_log를 사용하여 옵션이 선택되지 않는 이유에 대한 통찰력을 제공하는지 살펴 보겠습니다. – Dan

관련 문제