it-swarm.com.de

Selenium WebDriver - Testen Sie, ob das Element vorhanden ist

gibt es eine Möglichkeit, zu testen, ob ein Element vorhanden ist? Jede findElement-Methode würde mit einer Ausnahme enden, aber das ist nicht das, was ich will, weil es sein kann, dass ein Element nicht vorhanden ist und das in Ordnung ist.

Ich habe diesen Beitrag gefunden: Selenium c # Webdriver: Warten, bis Element vorhanden ist Aber dies ist für C # und ich bin nicht sehr gut darin. Kann jemand den Code in Java übersetzen? Es tut mir leid, Jungs, ich habe es in Eclipse ausprobiert, aber ich verstehe es nicht direkt in Java-Code.

Dies ist der Code:

public static class WebDriverExtensions{
    public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds){

        if (timeoutInSeconds > 0){
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }
}
137
tester

Verwenden Sie findElements anstelle von findElement.

findElements gibt eine leere Liste zurück, wenn keine übereinstimmenden Elemente anstelle einer Ausnahme gefunden werden.

Um zu überprüfen, ob ein Element vorhanden ist, können Sie dies versuchen

Boolean isPresent = driver.findElements(By.yourLocator).size() > 0

Dies gibt true zurück, wenn mindestens ein Element gefunden wird, und false, wenn es nicht vorhanden ist.

236
el roso

Wie sieht es mit einer privaten Methode aus, die einfach nach dem Element sucht und bestimmt, ob es so vorhanden ist:

private boolean existsElement(String id) {
    try {
        driver.findElement(By.id(id));
    } catch (NoSuchElementException e) {
        return false;
    }
    return true;
}

Das wäre ziemlich einfach und erledigt die Arbeit.

Edit: Sie könnten sogar noch weitergehen und einen By elementLocator als Parameter verwenden, um Probleme zu beseitigen, wenn Sie das Element nach etwas anderem als id suchen.

49
Dennis

Ich habe festgestellt, dass dies für Java funktioniert:

WebDriverWait waiter = new WebDriverWait(driver, 5000);
waiter.until( ExpectedConditions.presenceOfElementLocated(by) );
driver.FindElement(by);
14
Tango Ben
public static WebElement FindElement(WebDriver driver, By by, int timeoutInSeconds)
{
    WebDriverWait wait = new WebDriverWait(driver, timeoutInSeconds);
    wait.until( ExpectedConditions.presenceOfElementLocated(by) ); //throws a timeout exception if element not present after waiting <timeoutInSeconds> seconds
    return driver.findElement(by);
}
7
RedDeckWins

Ich hatte das gleiche Problem. Je nach Berechtigungsstufe eines Benutzers werden einige Links, Schaltflächen und andere Elemente für mich nicht auf der Seite angezeigt. Ein Teil meiner Suite testete, dass die Elemente, die fehlen sollten, fehlen. Ich habe stundenlang versucht, das herauszufinden. Endlich habe ich die perfekte Lösung gefunden. 

Dies bedeutet, dass der Browser nach allen angegebenen Elementen sucht. Wenn dies zu 0 führt, wurden keine Elemente gefunden, die auf der Spezifikation basieren. Dann muss der Code eine if-Anweisung ausführen, um mich zu informieren, dass er nicht gefunden wurde.

Dies ist in C#, daher müssen Übersetzungen in Java durchgeführt werden. Sollte aber nicht zu hart sein.

public void verifyPermission(string link)
{
    IList<IWebElement> adminPermissions = driver.FindElements(By.CssSelector(link));
    if (adminPermissions.Count == 0)
    {
        Console.WriteLine("User's permission properly hidden");
    }
}

Es gibt auch einen anderen Weg, den Sie wählen können, je nachdem, was Sie für Ihren Test benötigen.

Das folgende Snippet prüft, ob ein sehr bestimmtes Element auf der Seite vorhanden ist. Abhängig von der Existenz des Elements muss der Test ein if else ausführen. 

Wenn das Element vorhanden ist und auf der Seite angezeigt wird, habe ich console.write mich informieren lassen und fortfahren. Wenn das betreffende Element vorhanden ist, kann ich den von mir benötigten Test nicht ausführen. Dies ist der Hauptgrund für die Einrichtung dieses Elements.

Wenn das Element nicht vorhanden ist und nicht auf der Seite angezeigt wird. Ich habe das else im if else den test ausführen.

IList<IWebElement> deviceNotFound = driver.FindElements(By.CssSelector("CSS LINK GOES HERE"));
//if the element specified above results in more than 0 elements and is displayed on page execute the following, otherwise execute whats in the else statement
if (deviceNotFound.Count > 0 && deviceNotFound[0].Displayed){
    //script to execute if element is found
} else {
    //Test script goes here.
}

Ich weiß, ich bin etwas spät dran bei der Antwort auf das OP. Hoffentlich hilft das jemandem!

5
Tasha

Versuchen Sie folgendes: Rufen Sie diese Methode auf und übergeben Sie 3 Argumente:

  1. WebDriver-Variable // Annahme von driver_variable als Treiber.
  2. Das Element, das Sie überprüfen möchten. Sollte von By Methode zur Verfügung stellen. // ex: By.id ("id")
  3. Zeitlimit in Sekunden.

Beispiel: waitForElementPresent (driver, By.id ("id"), 10);

public static WebElement waitForElementPresent(WebDriver driver, final By by, int timeOutInSeconds) {

        WebElement element; 

        try{
            driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS); //nullify implicitlyWait() 

            WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds); 
            element = wait.until(ExpectedConditions.presenceOfElementLocated(by));

            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); //reset implicitlyWait
            return element; //return the element
        } catch (Exception e) {
            e.printStackTrace();
        } 
        return null; 
    }

Sie können den Code schneller ausführen, indem Sie das Selenium-Timeout vor der try-catch-Anweisung verkürzen.

Ich verwende den folgenden Code, um zu überprüfen, ob ein Element vorhanden ist.

protected boolean isElementPresent(By selector) {
    Selenium.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
    logger.debug("Is element present"+selector);
    boolean returnVal = true;
    try{
        Selenium.findElement(selector);
    } catch (NoSuchElementException e){
        returnVal = false;
    } finally {
        Selenium.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    }
    return returnVal;
}
3

Schreiben Sie die folgende Funktion/Methode mit Java:

protected boolean isElementPresent(By by){
        try{
            driver.findElement(by);
            return true;
        }
        catch(NoSuchElementException e){
            return false;
        }
    }

Rufen Sie die Methode während der Assertion mit dem entsprechenden Parameter auf.

3
Ripon Al Wasim

wenn Sie in Ruby rspec-Webdriver verwenden, können Sie dieses Skript verwenden, vorausgesetzt, ein Element sollte wirklich nicht vorhanden sein und ist ein erfolgreicher Test.

Schreiben Sie zuerst diese Methode aus Ihrer Klasse-RB-Datei

class Test
 def element_present?
    begin
        browser.find_element(:name, "this_element_id".displayed?
        rescue Selenium::WebDriver::Error::NoSuchElementError
            puts "this element should not be present"
        end
 end

Rufen Sie dann in Ihrer Spezifikationsdatei diese Methode auf.

  before(:all) do    
    @Test= Test.new(@browser)
  end

 @Test.element_present?.should == nil

Wenn Ihr Element NICHT vorhanden ist, wird Ihre Spezifikation übergeben, aber wenn das Element vorhanden ist, wird ein Fehler ausgegeben. Der Test ist fehlgeschlagen.

2
grayshell

Das funktioniert für mich:

 if(!driver.findElements(By.xpath("//*[@id='submit']")).isEmpty()){
    //THEN CLICK ON THE SUBMIT BUTTON
}else{
    //DO SOMETHING ELSE AS SUBMIT BUTTON IS NOT THERE
}
1
Amstel Bytes
public boolean isElementDisplayed() {
        return !driver.findElements(By.xpath("...")).isEmpty();
    }
0
Bogdan Shulga

Sie können implizites Warten versuchen: 

WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));

`

Oder Sie können explizit warten: `

IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });

`

Explicit prüft, ob das Element vorhanden ist, bevor eine Aktion ausgeführt wird. Implizites Warten könnte an jeder Stelle im Code aufgerufen werden. Zum Beispiel nach einigen AJAX -Aktionen.

Mehr finden Sie auf SeleniumHQ-Seite

0
streser

Um herauszufinden, ob ein bestimmtes Element vorhanden ist oder nicht, müssen wir die findElements () - Methode anstelle von findElement () verwenden.

int i=driver.findElements(By.xpath(".......")).size();
if(i=0)
System.out.println("Element is not present");
else
System.out.println("Element is present");

das ist für mich gearbeitet .. schlage mich vor wenn ich falsch liege .. 

0
Subbarao Gaddam

Das sollte es tun:

try {
    driver.findElement(By.id(id));
} catch (NoSuchElementException e) {
    //do what you need here if you were expecting
    //the element wouldn't exist
}
0
Scott Helme

Mein Codeausschnitt geben. Die nachstehende Methode prüft also, ob auf einer Seite ein zufälliges Webelement mit der Schaltfläche "Create New Application" vorhanden ist oder nicht. Beachten Sie, dass ich die Wartezeit als 0 Sekunden verwendet habe.

public boolean isCreateNewApplicationButtonVisible(){
    WebDriverWait zeroWait = new WebDriverWait(driver, 0);
    ExpectedCondition<WebElement> c = ExpectedConditions.presenceOfElementLocated(By.xpath("//input[@value='Create New Application']"));
    try {
        zeroWait.until(c);
        logger.debug("Create New Application button is visible");
        return true;
    } catch (TimeoutException e) {
        logger.debug("Create New Application button is not visible");
        return false;
    }
}
0
Rambo7

Ich würde so etwas verwenden (mit Scala [der Code in altem "gutem" Java 8 kann dem ähnlich sein))

object SeleniumFacade {

  def getElement(bySelector: By, maybeParent: Option[WebElement] = None, withIndex: Int = 0)(implicit driver: RemoteWebDriver): Option[WebElement] = {
    val elements = maybeParent match {
      case Some(parent) => parent.findElements(bySelector).asScala
      case None => driver.findElements(bySelector).asScala
    }
    if (elements.nonEmpty) {
      Try { Some(elements(withIndex)) } getOrElse None
    } else None
  }
  ...
}

also dann,

val maybeHeaderLink = SeleniumFacade getElement(By.xpath(".//a"), Some(someParentElement))
0
ses

Die einfachste Methode, die ich in Java gefunden habe, ist:

List<WebElement> linkSearch=  driver.findElements(By.id("linkTag"));
int checkLink=linkSearch.size();
if(checkLink!=0){  //do something you want}
0
i_am_leo