wake-up-neo.com

NoSuchElementExeption, Selen kann das Element nicht finden

ich möchte mein TextField in Selenium finden, aber ich weiß nicht wie (ich benutze Sellenium zum ersten Mal).

Ich habe es versucht:

 driver.findElement(By.id("originTextField"))

oder von xPath und cssSelector String, die von chrome in dev-Tools generiert werden.

Bitte helfen Sie mir, ich würde mich über eine Erklärung freuen.

das ist HTML:

 enter image description here

4

NoSuchElementException

org.openqa.Selenium.NoSuchElementException im Volksmund bekannt als NoSuchElementException erweitert org.openqa.Selenium .NotFoundException Dies ist eine Art von WebDriverException .

NoSuchElementException kann in 2 Fällen wie folgt ausgelöst werden:

  • Bei Verwendung von WebDriver.findElement(By by):

    //example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));
    
  • Bei Verwendung von WebElement.findElement(By by):

    //example : WebElement my_element = element.findElement(By.xpath("//my_xpath"));
    

Gemäß den JavaDocs sollte WebDriverException, NoSuchElementException die folgenden Konstantenfelder enthalten:

Constant Field      Type                                        Value
SESSION_ID          public static final Java.lang.String        "Session ID"
e.g. (Session info: chrome=63.0.3239.108)

DRIVER_INFO         public static final Java.lang.String        "Driver info"
e.g. (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86)

BASE_SUPPORT_URL    protected static final Java.lang.String     "http://seleniumhq.org/exceptions/"
e.g. (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html)

Grund

Der Grund für NoSuchElementException kann einer der folgenden sein:

  • Die von Ihnen übernommene Locator Strategy identifiziert kein Element im HTML-DOM .
  • Das von Ihnen gewählte Locator Strategy kann das Element nicht identifizieren, da es sich nicht im Viewport des Browsers befindet.
  • Die von Ihnen gewählte Locator Strategy identifiziert das Element, ist jedoch aufgrund des Attributs style = "display: none;" nicht sichtbar.
  • Die von Ihnen übernommene Locator Strategy identifiziert das gewünschte Element im HTML DOM nicht eindeutig und findet derzeit ein anderes versteckt/nsichtbar Element.
  • Das WebElement, das Sie suchen, befindet sich in einem <iframe> -Tag.
  • Die Instanz WebDriver sucht nach dem WebElement, noch bevor das Element im HTML DOM vorhanden/sichtbar ist.

Lösung

Die Lösung für die Adresse NoSuchElementException kann eine der folgenden sein:

  • Nehmen Sie eine Locator-Strategie an, die das gewünschte WebElement eindeutig identifiziert. Sie können Hilfe von Developer Tools (Ctrl+Shift+I oder F12) und benutze Element Inspector.

    Hier finden Sie eine ausführliche Diskussion zu wie Sie ein Element in Selenium3.6 untersuchen können, da ein Firebug für FF 56 nicht mehr möglich ist?

  • Verwenden Sie executeScript() , um das Element wie folgt anzuzeigen:

    WebElement elem = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
    

    Hier finden Sie eine ausführliche Diskussion zu Scrollen mit Selen zum Seitenanfang in Python

  • Wenn das Incase-Element das Attribut style = "display: none;" hat, entfernen Sie das Attribut wie folgt durch die Methode executeScript():

    WebElement element = driver.findElement(By.xpath("element_xpath"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element)
    element.sendKeys("text_to_send");
    
  • Um zu überprüfen, ob sich das Element in einem <iframe> befindet, durchlaufen Sie das HTML, um das entsprechende <iframe> -Tag und switchTo() das gewünschte iframe mit einer der folgenden Methoden zu finden:

    driver.switchTo().frame("frame_name");
    driver.switchTo().frame("frame_id");
    driver.switchTo().frame(1); // 1 represents frame index
    

    Hier finden Sie eine ausführliche Diskussion zu Ist es möglich, ohne Verwendung von driver.switchTo (). Frame (“frameName”) in Selenium Webdriver Java zu einem Element in einem Frame zu wechseln? .

  • Wenn das Element nicht sofort vorhanden/sichtbar im HTML-DOM ist, induzieren Sie WebDriverWait with ExpectedConditions setze die richtige Methode wie folgt:

    • Warten auf presenceOfElementLocated :

      new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
      
    • Warten auf visibleOfElementLocated :

      new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
      
    • Warten auf elementToBeClickable :

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
      
10
DebanjanB

Ihr Code ist korrekt. Ich vermute, das Problem hat dazu geführt, dass die Seite nicht vollständig geladen wurde, wenn Sie das Element finden. 

Fügen Sie einen langen Schlaf hinzu, bevor Sie das Element finden. Wenn Sie den Schlaf verbessert haben, ändern Sie den Schlaf in Warten.

Hier ist der Code: Es bedeutet 10s warten, wenn das Element nicht vorhanden ist:

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "originTextField"))
)
0
yong