it-swarm.com.de

Python - Selenium WebDriver - Überprüfungselement ist vorhanden

Ich habe ein Problem - Ich verwende den Selenium (Firefox) -Treiber, um eine Webseite zu öffnen, auf einige Links zu klicken usw. Ein Screenshot zu erstellen.

Mein Skript läuft gut von der CLI, aber wenn es über einen Cronjob ausgeführt wird, kommt es nicht an dem ersten find_element () -Test vorbei. Ich muss etwas Debug hinzufügen oder etwas, das mir hilft herauszufinden, warum es fehlschlägt.

Grundsätzlich muss ich vor dem Aufrufen der Anmeldeseite auf einen Anmelde-Anker klicken. Das Konstrukt des Elements ist:

<a class="lnk" rel="nofollow" href="/login.jsp?destination=/secure/Dash.jspa">log in</a>

Ich verwende die find_element By LINK_TEXT-Methode:

login = driver.find_element(By.LINK_TEXT, "log in").click()

Ich bin ein bisschen ein Python Noob, also kämpfe ich ein bisschen mit der Sprache ...

A) Wie überprüfe ich, ob der Link tatsächlich von Python aufgenommen wird? Soll ich try/catch block verwenden?

B) Gibt es eine bessere/zuverlässigere Möglichkeit, das DOM-Element als mit LINK_TEXT zu finden? Z.B. In JQuery können Sie einen spezifischeren Selektor $ verwenden ('a.lnk: enthält (einloggen)'). Do_something ();


Ich habe das Hauptproblem gelöst und es waren nur Fingerprobleme - Ich habe das Skript mit falschen Parametern aufgerufen - Einfacher Fehler.

Ich hätte gerne noch ein paar Hinweise, wie man prüfen kann, ob ein Element existiert. Außerdem ein Beispiel/eine Erklärung für implizite/explizite Wartezeiten anstelle eines beschissenen Aufrufs von time.sleep (). 

Prost, ns

43
nonshatter

A) Ja. Der einfachste Weg, um zu überprüfen, ob ein Element vorhanden ist, ist, einfach find_element in einem try/catch aufzurufen.

B) Ja, ich versuche immer aus zwei Gründen Elemente zu identifizieren, ohne deren Text zu verwenden: 

  1. der Text ändert sich eher und;
  2. wenn dies für Sie wichtig ist, können Sie Ihre Tests nicht mit lokalisierten Builds durchführen.

lösung entweder:

  1. Sie können xpath verwenden, um ein übergeordnetes oder Vorfahrenelement zu finden, das eine ID oder einen anderen eindeutigen Bezeichner hat, und dann dessen untergeordnetes/untergeordnetes Element zu finden, das mit oder übereinstimmt.
  2. sie können eine ID oder einen Namen oder eine andere eindeutige Kennung für den Link selbst anfordern.

Mit den folgenden Fragen können Sie anhand von try/catch feststellen, ob ein Element vorhanden ist oder nicht, und gute Beispiele für Wartezeiten finden Sie hier: http://seleniumhq.org/docs/04_webdriver_advanced.html

40
Sam Woods

ein)

from Selenium.common.exceptions import NoSuchElementException        
def check_exists_by_xpath(xpath):
    try:
        webdriver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

b) verwenden Sie xpath - das zuverlässigste. Darüber hinaus können Sie den xpath als Standard in allen Ihren Skripts verwenden und Funktionen wie oben erwähnt für den universellen Gebrauch erstellen.

UPDATE: Ich habe die erste Antwort vor über 4 Jahren geschrieben und damals dachte ich, dass xpath die beste Option wäre. Jetzt empfehle ich die Verwendung von css-Selektoren . Ich empfehle trotzdem, "nach ID", "nach Name" usw. nicht zu mischen/zu verwenden und stattdessen eine einzige Methode zu verwenden.

68
Alex Okrushko

Keine der angebotenen Lösungen schien mir am einfachsten zu sein, daher möchte ich meinen eigenen Weg hinzufügen.

Grundsätzlich erhalten Sie die Liste der Elemente statt nur des Elements und zählen dann die Ergebnisse. Wenn es Null ist, existiert es nicht. Beispiel: 

if driver.find_elements_by_css_selector('#element'):
    print "Element exists"

Beachten Sie das "s" in find_elements_by_css_selector, um sicherzustellen, dass es zählbar ist.

EDIT: Ich habe den len( der Liste überprüft, aber vor kurzem habe ich erfahren, dass eine leere Liste falsch ist. Sie brauchen also nicht die Länge der Liste, sondern benötigen einfacheren Code. 

Eine andere Antwort sagt auch, dass die Verwendung von xpath zuverlässiger ist, was einfach nicht stimmt. Siehe Was ist der Unterschied zwischen css-selector und Xpath? Was ist besser (nach Leistung und für Cross-Browser-Tests)?

37
Brian Leishman

Lösung ohne Try & Catch und ohne neue Importe:

if len(driver.find_elements_by_id('blah')) > 0: #pay attention: find_element*s*
    driver.find_element_by_id('blah').click #pay attention: find_element
2
Super Mario

Das selbe wie Brian, aber fügen Sie diese Antwort von tstempko hinzu:

https://sqa.stackexchange.com/questions/3481/quicker-way-to-assert-that-an-element-does-not-exist

Also habe ich es versucht und es funktioniert schnell:

driver.implicitly_wait(0)

if driver.find_element_by_id("show_reflist"):        
 driver.find_element_by_id("show_reflist").find_element_by_tag_name("img").click()

danach stelle ich meinen Standardwert wieder her

driver.implicitly_wait(30)
1
vmk

driver.find_element_by_id("some_id").size() ist Klassenmethode.

Was wir brauchen, ist: 

driver.find_element_by_id("some_id").size das ist das Wörterbuch also:

if driver.find_element_by_id("some_id").size['width'] != 0 : print 'button exist'

0
Lopi Dani

Sie könnten es auch knapper machen

driver.find_element_by_id("some_id").size() != 0
0
Rohith R Nair