2017-06-10 2 views
6

Ich habe ein Stück Code in einem Python-Crawler, der früher funktioniert. Ich habe es auf einem neuen System installiert und versuche nun, die richtigen Abhängigkeiten zu finden. Bei der Verwendung von geckodriver 0.13.0 und Ausführen des folgenden Code:Selen und Geckodriver Problem mit der Erstellung eines Webdriver in Python

 def login(self): 
      print self.colors.OKBLUE + "Logging into my site as User: " + self.config.email + self.colors.ENDC 
      username = self.driver.find_element_by_css_selector('.my_user_field') 
      for c in self.config.email: 
        print "Sending key: " + c 
        username.send_keys(c + "") 

ich die folgende Fehlermeldung erhalten:

Sending key: b 
Traceback (most recent call last): 
    File "main.py", line 20, in <module> 
    crawler.start() 
    File "/home/tyrick/dev/pycrawlers/sc/src/main/python/new.py", line 39, in start 
    self.login() 
    File "/home/tyrick/dev/pycrawlers/sc/src/main/python/new.py", line 147, in login 
username.send_keys(c) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 349, in send_keys 
    'value': keys_to_typing(value)}) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 493, in _execute 
    return self._parent.execute(command, params) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: Expected [object Undefined] undefined to be a string 

ich an einigen Stellen lesen, die einen Fehler mit dieser geckodriver hat, und ich möchte verwenden 0.16.0. Also habe ich versucht, das so gut wie 0.17.0, aber ich bin jetzt die folgende Fehlermeldung erhalten:

Traceback (most recent call last): 
    File "main.py", line 18, in <module> 
    crawler = New() 
    File "/home/tyrick/dev/pycrawlers/sc/src/main/python/new.py", line 28, in __init__ 
    self.driver = webdriver.Firefox() 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 152, in __init__ 
keep_alive=True) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 98, in __init__ 
    self.start_session(desired_capabilities, browser_profile) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 188, in start_session 
    response = self.execute(Command.NEW_SESSION, parameters) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 256, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response 
    raise exception_class(message, screen, stacktrace) 
selenium.common.exceptions.WebDriverException: Message: elementScrollBehavior was not a the name of a known capability or a valid extension capability 

Es ist, als wenn ich jetzt nicht einmal den Treiber initialisieren. Ich benutze Selenium 3.4.3, was von dem, was ich gelesen habe, in Ordnung ist.

Wenn mich jemand zu einer Lösung führen kann, würde ich es sehr schätzen! Danke

+0

Hey Tyrick! Immer noch auf dieses Problem zu debuggen? Haben Sie sich meinen Vorschlag und meine Anfrage angesehen? Prost! – iamdanchiv

Antwort

5

Sie haben Recht, Sie haben zwei verschiedene Probleme.

Issue with geckodriver 0.13.0 :

Dies ist höchstwahrscheinlich, weil Ihr cundefined ist.

Sie müssen bestätigen/bestätigen, dass self.config.email tatsächlich eine gültige Zeichenfolge (E-Mail) zurückgibt. Überprüfen Sie also, ob c Ihre erwartete E-Mail enthält, bevor Sie den Befehl .send_keys() absetzen.

Eine weitere Verbesserung, die hier bemerkenswert ist, ist Ihre mangelnde Sicherheit, wenn es darum geht, das Feld Benutzername zu finden. Sie sollten eine explizite Wartezeit verwenden!

# Library imports 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

# (...) 

def login(self): 
    print self.colors.OKBLUE + "Logging into my site as User: " + 
    self.config.email + self.colors.ENDC 

    # Polls the DOM for 3 seconds trying to find '.my_user_field' 
    username = WebDriverWait(self.driver, 3).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.my_user_field'))) 

    for c in self.config.email: 

     # Validate 'c' is of type string 
     if (str(type(c)).find('str') != -1): 
      print "Sending key: " + c 
      username.send_keys(c + "") 
     else: 
      print "'c' is not what it used to be!" 

Schließlich fügen Sie den vollständigen Code-Schnipsel, weil es aussieht wie Sie durch eine Liste von E-Mail Radfahren und sie in dem zuvor gefundenen Benutzername Feld zu schicken.

Issue with geckodriver 0.16.0 :

Dieser Fehler ist, weil Sie ein Problem mit Ihrem Fahrer Instanziierung haben: self.driver = webdriver.Firefox().

Bitte aktualisieren Sie die Frage mit dem vollständigen Codeschnipsel Ihrer Treiberdeklaration (einschließlich der Funktionen & Profile, falls vorhanden). Sonst ist es wirklich schwer, die Ursache des Fehlers herauszufinden.

+0

So stellt sich heraus, dass "c" die richtige E-Mail-Zeichenfolge enthält. Sie können sogar in dem Ausdruck oben sehen: "Sende-Taste: b", wobei "b" das erste Zeichen meiner E-Mail ist. Ich denke, ich werde den Chrome-Treiber ausprobieren und auf Sie zurückkommen. – Tyrick

+0

Sicher @Tyrick! Lass mich wissen, wie es gelaufen ist. Prost! – iamdanchiv

+0

Dieses Problem ist auf einen Fehler mit der letzten Firefox-Version (53 und höher) zurückzuführen, überprüfe meine Antwort, dieses Problem wurde bereits behoben und wird in der nächsten Version von checkodriver nicht mehr angezeigt. – SEDaradji

1

Dies ist eigentlich nichts mit Ihrem Code zu tun, das ist ein Fehler mit der neuesten Version von Firefox diese issue thread auf dem Repository Geckodriver überprüft, müssen Sie:

  • Herunterstufung zu Firefox 52.0.
  • Warten Sie auf die nächste Version von Geckodriver.
  • Herunterladen und kompilieren Geckodriver manuell.
  • Verwenden ein anderer Fahrer wie Chrome driver

Die beste Option i ist das erste glauben, Sie werden auch automatische Updates deaktivieren müssen, sobald Sie Herabstufung von Firefox zu verhindern, auf die neueste Version (Einstellungen-> Erweitert zurück -> Update-> überprüfen nie nach Updates)

1

Hier ist die Antwort auf Ihre Frage:

  • gemäß der Frage Überschrift ich verstehe das Problem beginnt, Mozilla Firefox durch GeckoDriver.
  • Wie Sie Ihre Selenium Version als 3.4.3 erwähnt haben, können Sie das Hauptproblem eines der folgenden entweder geckodriver v0.16.0 oder v0.16.1 oder v0.17.0
  • Wie pro Ihre letzte Fehler-Stack-Trace prüfen, mit ist Konfigurieren der WebDriver-Instanz.
  • Es ist zu beachten, dass die aktuelle Selenium-Python-Bindung ist instabil mit geckodriver und scheint, Architektur spezifisch zu sein. Sie können die Github discussion und merge hier finden. So müssen Sie zusätzlich den absoluten Pfad des firefox binär als firefox_binary Argument übergeben, während die Initialisierung WebDriver

  • Hier ist der Codeblock Arbeitssatz mit Selenium Version 3.4.3, geckodriver v0.17.0 & Mozilla Firefox 53.0 durch Python 3.6.1, die die URL http://www.python.org öffnet: me

    from selenium import webdriver 
    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
    
    if __name__ == '__main__': 
    
        binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe') 
        driver = webdriver.Firefox(firefox_binary=binary,executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe") 
        driver.get("http://www.python.org") 
    

Lassen Sie wissen, ob Ihre Frage damit beantwortet.

+1

Hier nicht pingelig zu sein, aber haben Sie seine Fehler-Rückverfolgung von Anfang bis Ende gelesen/verfolgt? :) Sein erstes Problem ('0.16.0') ist ** 100% ** ein' .send_keys() 'Problem, und das zweite (' 0.17.0') hat einen anderen Fehler als der, auf den Sie gezeigt haben ** [this] (https://github.com/SeleniumHQ/selenium/issues/3884) **): AFAIK, 'selenium.common.exceptions.WebDriverException: Nachricht: Es ist nicht möglich, einen passenden Satz von Fähigkeiten zu finden' ist anders von 'selen.common.exceptions.WebDriverException: Nachricht: elementScrollBehavior war nicht der Name einer bekannten Fähigkeit oder einer gültigen Erweiterungsfähigkeit. – iamdanchiv

+0

Die Angabe des absoluten Pfads hat nicht geholfen. Es gab immer noch einen Fehler mit: "selen.common.exceptions.WebDriverException: Nachricht: elementScrollBehavior war nicht der Name einer bekannten Fähigkeit oder einer gültigen Erweiterungsfähigkeit" – Tyrick

+0

@Tyrick My Answer haben nichts mit 'elementScrollBehavior' zu tun. Meine Antwort zielt auf den Fragenkopf von Selenium/geckodriver ab. Danke – DebanjanB

1

Ich habe nicht genug Ruf, um einen Kommentar hinzuzufügen, aber in Bezug auf @ iamdanchivs Antwort, was "mangelnde Sicherheit, wenn es darum geht, das Feld Benutzername zu finden. Sie sollten eine explizite Wartezeit verwenden!" Meinst du, dass es keine Sicherheit gibt, einen Fehler zu melden?

+0

Ich meinte, dass er einen Schwachpunkt hat Diese ungeschützte '.find_element_by_css_selector()' Anweisung. Da Web-Seiten an die Antwortzeiten des Web-Servers gebunden sind, ist es die beste Vorgehensweise **, auf jedes Element mindestens einige Sekunden zu warten (solange Sie keine impliziten Wartezeiten verwenden). Andernfalls enden Sie mit flockigen Funktionstests ... die im Grunde genommen s # @ * sind, da Sie ihnen nicht genug vertrauen können, um sie für Build-Bereitstellungen zu verwenden. – iamdanchiv

+0

Und durch explizite Wartezeit meinst du so etwas wie time.sleep()? –

+1

Nein, 'time.sleep()' und verwandte Befehle sollten niemals außerhalb des Debugging-Bereichs verwendet werden. Eine explizite Wartezeit fragt das DOM (normalerweise alle 250 oder 500 ms, hängt vom Framework ab) für die angegebene Zeitspanne ab. Es wird die "WebElement" - oder eine "NoSuchElement" -Ausnahme zurückgegeben. Überprüfen Sie ** [StackOverflow SeleniumWebdriver Dokumentation - Wartet] (https://stackoverflow.com/documentation/selenium-webdriver/4435/wait#t=201706191154328390365) ** oder die ** [offizielle Dokumentation] (http: // www .seleniumhq.org/docs/04_webdriver_advanced.jsp) **, wo sie auf "WebElements" warten. Ich hoffe es hilft! – iamdanchiv

Verwandte Themen