8

crontab -e을 사용하여 실행중인 헤드리스 브라우저를 사용하는 스크립트가 있습니다. 그것은 처음 몇 번은 잘 실행하고 다음 역 추적과 충돌 :몇 번의 실행 후 헤드리스 스크립트가 충돌 함

Traceback (most recent call last): 
    File "/home/clint-selenium-firefox.py", line 83, in <module> 
    driver.get(url) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 248, in get 
    self.execute(Command.GET, {'url': url}) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: Failed to decode response from marionette 

내 crontab을 선은 다음과 같습니다

*/10 * * * * export DISPLAY=:0 && python /home/clint-selenium-firefox.py >> /home/error.log 2>&1 

내가했습니다, 그래서 파이썬 스크립트로이 과부하 싶지 않아 내가 생각하기에 관련있는 비트를 뽑았다.

from pyvirtualdisplay import Display 

display = Display(visible=0, size=(800, 600)) 
display.start() 
... 
driver = webdriver.Firefox() 
driver.get(url) 
... 
driver.quit() 
... 
display.stop() 

귀하의 도움에 감사드립니다.

편집

버전 : 파이어 폭스 49.0.2; 셀레늄 : 3.0.1; geckodriver : geckodriver-v0.11.1-linux64.tar.gz

오류 (driver.get(url)에 실패) 주위 코드 :이 더 --marionette 포트 옵션을 geckodriver에 전달되지 않기 때문에

driver = webdriver.Firefox() 
if DEBUG: print "Opened Firefox" 

for u in urls: 
    list_of_rows = [] 
    list_of_old_rows = [] 

    # get the old version of the site data 
    mycsvfile = u[1] 
    try: 
     with open(mycsvfile, 'r') as csvfile: 
      old_data = csv.reader(csvfile, delimiter=' ', quotechar='|') 
      for o in old_data: 
       list_of_old_rows.append(o) 
    except: pass 

    # get the new data 
    url = u[0] 
    if DEBUG: print url  

    driver.get(url) 
    if DEBUG: print driver.title 
    time.sleep(1) 
    page_source = driver.page_source 
    soup = bs4.BeautifulSoup(page_source,'html.parser') 
+0

보십시오. 마리오네트를 사용해야합니까? – HenryM

+0

사용중인 firefox, selenium 및 geckodriver 버전은 무엇입니까? –

+0

각각의 경우 최신 버전을 다운로드 중입니다 – HenryM

답변

6

Multiple Firefox instances failing with NS_ERROR_SOCKET_ADDRESS_IN_USE #99에서 - 모든 geckodriver가 firefox가 원하는 기본 포트 (2828)를 통과한다는 것을 의미합니다. 첫 번째 파이어 폭스 인스턴스는 해당 포트에 바인드되며 이후 인스턴스는 그렇지 못하며 모든 geckodriver 인스턴스는 첫 번째 파이어 폭스 인스턴스에 연결되어 결국 모든 종류의 예측할 수없는 동작을 발생시킵니다.

뒤에 오는 것 : 나는 다른 적당한 운전자가하고있는 것을하고, Marionette가 geckodriver에 의해 생성되는 무작위로 고쳐 졌던 자유로운 항구에 묶는 것을 요청한다. 현재 파이어 폭스에서 생성 된 모든 인스턴스의 기본값으로 2828을 사용합니다. Marionette는 불행히도 포트를 클라이언트 (geckodriver)에게 다시 알리는 out-of-band 방식이 없기 때문에 본질적으로 열세이지만 앞으로 버그 1240830의 제안 중 하나를 사용하여 상황을 개선 할 수 있습니다.

change

는 오랫동안 작동 나는 무작위로 추측

Selenium 3.0.0.b2 
* Updated Marionette port argument to match other drivers. 

에서 만들어졌다. issue을 발생시킵니다. 가지고있는 셀레늄, 파이어 폭스 및 geckodriver의 버전에는 코드 수정이 필요할 수 있습니다. 이 문제가 해결 될 때까지 Selenium 2.53.0 및 firefox esr 38.8을 사용하여 되돌릴 수 있습니다. 너의 전화.

업데이트 :을 많이하고 또는 이것에 대해 읽어 봤는데

from selenium import webdriver 
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 

binary = FirefoxBinary('path/to/binary') 
driver = webdriver.Firefox(firefox_binary=binary) 
+0

이전 버전으로 돌아가려고합니다. Selenium 2.53.0 설치는 쉬웠지만 firefox esr 38.8을 얻으려고 애 쓰고 있습니다. 나는'sudo apt-get install iceweasel'을 시도하고 있으며 파이어 폭스의 최신 버전을 선택하고 설치하기 만하면된다. 이전 버전을 강제 실행하는 방법에 대해 조언 해 주실 수 있습니까? – HenryM

+0

나는 당신이 제안한 버전으로 돌아갈 수 있었지만'OSError : [Errno 13] Permission denied'를 받았습니다. – HenryM

+0

리눅스에서 저는 Google 크롬 브라우저를 열고 https://download.mozilla.org를 입력했습니다. /?product=firefox-38.8.0esr-SSL&os=linux&lang=ach – MikeJRamsey56