2017-07-06 4 views
-2

immer wenn ich das folgende Skript durch Shell laufen seine Arbeit, aber wenn ich das gleiche Skript über Python-Modul oder pycharm läuft es funktioniert nicht, es nicht die Daten abrufen. Kann mir bitte jemand helfen?Python: Selen webscraping Skript funktioniert nicht durch Modul

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
browser = webdriver.Firefox() 
site = browser.get("https://www.flipkart.com/") 
searchInput = browser.find_element_by_class_name("LM6RPg") 
searchInput.send_keys('Laptop') 
searchInput.send_keys(Keys.ENTER) 
titleResults = browser.find_elements_by_xpath("//div[@class='_3wU53n']") 
for title in titleResults: 
    print(title.text) 

Antwort

0

Sie sollten implicitly_wait nach browser = webdriver.Firefox() gesetzt, denn wenn man in der Schale laufen die Seite Zeit vollständig geladen haben und wenn Sie es wie ein Modul laufen Sie sind nicht für die Seite wartet auf alle laden, so soll es sein :

browser = webdriver.Firefox() 
browser.implicitly_wait(10) 

Dies ist für maximal 10 Sekunden warten, wird das Element zu finden, bevor eine Ausnahme ausgelöst wird.

Alternativen sind:

browser.explicitly_wait(10) 

die 10 Sekunden warten und danach wird das Element

oder

sleep(5) 

vor der Suche nach Element nach einem Klick auf eine Schaltfläche suchen. Sie können die Sekunden einstellen, um zu sehen, welche passt. Und vergessen Sie nicht zu importieren sleep von time Modul: from time import sleep

Lassen Sie mich wissen, wenn dies Ihnen hilft. Hier

+0

Vielen Dank für Ihre Hilfe, aber es gibt immer noch einige Fehler mit dem Code es nicht alle das Ergebnis zu holen, in der tatsächlichen Website gibt es 18 Ergebnisse in der ersten Seite, aber wenn ich das Skript ausführen, ist es nur Wenn Sie 10 Ergebnisse von 18 erhalten, sind die Klassennamen für alle Elemente auf der Webseite gleich. Könnten Sie mir bitte auch dabei helfen? –

+0

Ja, ich habe mich selbst getestet und ich denke, dass nicht jedes Produkt geladen ist, wenn man nach ihnen sucht und ich nach der Suche nach "Laptop" 5 Sekunden gewartet habe und 18 Produkte gefunden habe, also am Anfang der Datei put 'from time import sleep' und nach' searchInput.send_keys (Keys.ENTER) 'put' sleep (5) 'und es wird funktionieren. Bitte akzeptiere meine Antwort, wenn es jetzt funktioniert. –

+0

Vielen Dank es hat funktioniert –

0

ist die Antwort auf Ihre Frage:

from selenium import webdriver 
    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary 
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
    from selenium.webdriver.common.keys import Keys 
    from selenium.webdriver.support import expected_conditions as EC 
    from selenium.webdriver.common.by import By 
    from selenium.webdriver.support.ui import WebDriverWait 

    binary = FirefoxBinary('C:\\Program Files\\Mozilla Firefox\\firefox.exe') 
    caps = DesiredCapabilities().FIREFOX 
    caps["marionette"] = True 
    browser = webdriver.Firefox(capabilities=caps, firefox_binary=binary, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe") 

    site = browser.get("https://www.flipkart.com/") 
    searchInput = browser.find_element_by_xpath("//input[@class='LM6RPg']") 
    searchInput.send_keys('Laptop') 
    searchInput.send_keys(Keys.ENTER) 
    WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='container']//div[text()='Dell Inspiron Core i3 6th Gen - (4 GB/1 TB HDD/Windows 10 Home) 3467 Notebook']"))) 
    titleResults = browser.find_elements_by_xpath("//div[@class='_3wU53n']") 
    for title in titleResults: 
     print(title.text) 

Lassen Sie mich wissen, ob dies Ihre Frage beantwortet.

+0

Vielen Dank für Ihre Hilfe, ich habe browser.implicitly_wait in meinem Skript hinzugefügt und jetzt funktioniert es gut, noch ein Gefallen, können Sie mir bitte vorschlagen, ein Buch oder eine Website, um mehr zu erfahren über Webdriver und Selen? –

+0

@sandipghoshal ImplicitlyWait scheint einfach zu implementieren, aber laut Jim & kürzlich Austin Selenium Conference ImplicitlyWait kann in Selen 4.0 veraltet sein. Daher basierte meine Lösung auf ExplicitlyWait. Lass mich deine Gedanken dazu wissen. Vielen Dank – DebanjanB

Verwandte Themen