2017-12-18 4 views
0

Ich versuche, eine Datei von einer Website mit Selenium und Python 3 herunterzuladen. Dazu muss eine Bestätigungsschaltfläche in einem Overlay-Fenster gedrückt werden. Das Überlagerungsfenster befindet sich nicht in einem iFrame - der HTML-Code wird einfach dynamisch hinzugefügt, wenn das Overlay angezeigt wird - aber Selenium kann die Schaltfläche nicht mit xPath finden und gibt NoSuchElementException zurück. Fehle ich irgendetwas, das Selenium dazu bringen könnte, das Element nicht zu sehen, wie es in der Seitenquelle erscheint? Soweit ich das beurteilen kann, sollte Selen in der Lage sein, den Knopf ohne Problem zu lokalisieren.Selen kann Element im Hauptfenster nicht finden

#Initialize Driver 
driver = webdriver.Safari() 

cmd = "osascript -e 'tell application \"Safari\" to set bounds of front window to {0, 22, 1500, 1022}'" 
os.system(cmd) 

#Call up seach link 
driver.get(data_url) 

wait_a = WebDriverWait(driver, 15) 
element = wait_a.until(EC.presence_of_element_located((By.ID, "md-input-3"))) 

#Initialize and send login information (defined above) 
username = driver.find_element_by_id("md-input-3") 
password = driver.find_element_by_id("md-input-6") 

username.send_keys(crunchbase_username) 
password.send_keys(crunchbase_password) 

#Click login button 
password.send_keys(Keys.ENTER) 

#Wait for results page to finish loading 
wait = WebDriverWait(driver, 15) 
element = wait.until(EC.title_contains("Signals")) 

time.sleep(2) 

#Press Download Button 
driver.find_element_by_xpath("//button[@aria-label='Export your results']").click() 
time.sleep(2) 

#Press csv button 
driver.find_element_by_xpath("//button[@aria-label='Export to CSV']").click() 
time.sleep(2) 

#Confirm downlaod 
driver.find_element_by_xpath("//*[@id='cdk-overlay-36']/md-dialog-container/confirmation-dialog/dialog-layout/div/md-dialog-actions/div/button[2]").click() 

#Close driver 
#driver.close() 

Die Seite Quelle ist zu kompliziert und sehr stilisiert, so werde ich es hier nicht enthalten, sondern ein Screenshot von dem entsprechenden Abschnitt des Codes in Web-Inspektoren meines Browsers ist unten. Das Element, auf das ich klicken möchte, ist blau markiert.

Web Inspector Screenshot

schätzen ich Hilfe mit diesem.

+0

Ist dies eine öffentlich verfügbare URL, die Sie teilen können? Welche Linie bildet das Obige ist die Problematik? Download bestätigen? Ist dies das hervorgehobene Element auf deinem Screenshot, das du finden möchtest? –

+0

Sie haben nicht erwähnt, über welche "Bestätigungsschaltfläche". Wie wirkt ** zu kompliziert und stark stilisiert? ** "HTML" macht einen Unterschied beim Einfügen als "Formatierter Text" oder ein "Bild" – DebanjanB

Antwort

0

Es ist schwer, ohne auf die Seite unter Frage Zugang zu erzählen und sehen zu können, was los ist. Einige allgemeine Punkte:

  1. Versuchen Sie Css-Selektoren anstelle von Xpath. Sie sind robuster, einfacher zu handhaben und schneller.
  2. Avoid mit dynamisch generierten IDs. In Ihrem Screenshot kann ich nicht einmal eine ID sehen, die in Ihrem Code erscheint.
  3. Wenn Sie mehr als ein Element der gleichen Art haben (wie Buttons in Ihrem Fall), versuchen Sie, alle Webelemente unter einem bestimmten Elternteil zu finden und testen Sie alle, ob Sie einen Attributwert haben, nach dem Sie suchen.

Zum Beispiel:

elemItems = driver.find_elements_by_css_selector(menuItemSelector) 

for element in elements: 
    if element.text == "export": 
     elemItems[1].click() 

Hier findet man alle Elemente eines bestimmten Typs (Tasten zum Beispiel), und wählen Sie einen finden, der „Export“ Text in ihm hat.

0

Bevor auf das Element klicken, führen Sie die folgenden Zeilen:

WebElement element = driver.findElement(By.xpath(" path_of_your_module ")); 
((JavaScriptExecutor) driver). executeScript("argument[0].scrollIntoView(true);", element); 
Verwandte Themen