2016-07-23 23 views

Antwort

0

NoSuchElementException passiert, wenn das Element, das Sie suchen, zum Zeitpunkt der Auflösungsanforderung nicht im DOM vorhanden ist. Es gibt normalerweise zwei Ursachen:

  1. Selenium versucht, das WebElement aufzulösen, bevor es auf der Seite sichtbar ist.
  2. Ihre XPath ist falsch

Die zweite ist einfach. Überprüfen Sie Ihren XPath (mit einem Tool wie FirePath).

Wenn Ihr XPath korrekt ist, ist es wahrscheinlich der erste. In diesem Fall wird WebDriverWait oder PageFactory helfen.

WebDriverWait ist eine Inline-Lösung für Ihren Test, mit der die Suche für einen bestimmten Zeitraum wiederholt werden kann, bevor sie fehlschlägt.

WebDriverWait wait = new WebDriverWait(dr, 10); //10 second wait 
WebElement sett = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@data-tooltip='Settings']")); 
sett.click(); 

Das sollte die Seitenladezeit berücksichtigen.

Beachten Sie, dass WebDriverWait für maximal die konfigurierten Zeit halten wird, kann aber früh freigeben, wenn die Bedingung erfüllt ist! immer eine Warten über Thread.sleep verwenden

Die zweite Option ist ein PageFactory, die zusätzlichen Merkmale der Selenium API nutzt und eine wohldefinierte API mehrere Tests mit einer gemeinsamen Umsetzung zu unterstützen. Dies ist eine sehr flexible Lösung für die Unterstützung einer Reihe von Tests, die gemeinsame Interaktionen durchführen müssen!

public class PageWithSettings { 

     @FindBy(xpath="//div[@data-tooltip='Settings']") 
     WebElement settings; 

     public void openSettings() { 
      //Settings will resolve on-demand through the Selenium framework 
      settings.click(); 
     } 
    } 

Dann verwenden Sie es in Ihrem Test (s) für eine gemeinsame gemeinsame Implementierung.

public class MySeleniumTest { 
     @Test 
     public void openSettings() { 
      WebDriver driver = new FirefoxDriver(); 
      driver.get("myPageWithSettings"); 

      // Use the PageFactory to stand up the reference. 
      PageWithSettings pageSettings = PageFactory.initElements(driver, PageWithSettings.class); 
      //Call the API method to open the settings page. 
      pageSettings.openSettings(); 
     } 

    } 

Zuerst stelle ich drei Seite Fabriken.

E-Mail-Adresse Eintrag

package gmail; 

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

public class EmailEntryPage { 
    @FindBy(id = "Email") 
    private WebElement emailAddress; 
    @FindBy(id = "next") 
    private WebElement next; 

    public void enterEmailAddress(String gmailAccount) { 
     emailAddress.sendKeys(gmailAccount); 
     next.click(); 
    } 
} 

Passwort Eingabe

package gmail; 

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

public class AccountPasswordPage { 
    @FindBy(id = "Passwd") 
    private WebElement accountPass; 
    @FindBy(id = "signIn") 
    private WebElement signIn; 

    public void enterPassword(String passWd) { 
     accountPass.sendKeys(passWd); 
     signIn.click(); 
    } 
} 

Seite, die Einstellungen Tasten hat

package gmail; 

import org.openqa.selenium.WebElement; 
import org.openqa.selenium.support.FindBy; 

public class PageWithSettings { 
    @FindBy(id=":2m") 
    private WebElement settingsDropDown; 
    @FindBy(id=":2o") 
    private WebElement densityComfortable; 
    @FindBy(id=":2p") 
    private WebElement densityCozy; 
    @FindBy(id=":2q") 
    private WebElement densityCompact; 
    @FindBy(id="101:settings") 
    private WebElement configureInbox; 
    @FindBy(id="ms") 
    private WebElement settings; 
    @FindBy(id="pbwc") 
    private WebElement themes; 
    @FindBy(id=":2r") 
    private WebElement help; 

    public void setDensityComfortable() { 
     settingsDropDown.click(); 
     densityComfortable.click(); 
    } 
    public void setDensityCozy() { 
     settingsDropDown.click(); 
     densityCozy.click(); 
    } 
    public void setDensityCompact() { 
     settingsDropDown.click(); 
     densityCompact.click(); 
    } 

    public void configureInbox() { 
     settingsDropDown.click(); 
     configureInbox.click(); 
    } 

    public void openSettings() { 
     settingsDropDown.click(); 
     settings.click(); 
    } 

    public void openThemes() { 
     settingsDropDown.click(); 
     themes.click(); 
    } 

    public void openHelp() { 
     settingsDropDown.click(); 
     help.click(); 
    } 
} 

Ich habe dann einen Test, die Wechselwirkungen zu überprüfen:

import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.PageFactory; 

import gmail.AccountPasswordPage; 
import gmail.EmailEntryPage; 
import gmail.PageWithSettings; 

public class GmailSignInWithSettings { 

    private final String MY_EMAIL = ""; 
    private final String MY_ACCOUNT_PASS= ""; 

    private WebDriver driver; 
    @Before 
    public void constructDriver() { 
     driver = new FirefoxDriver(); 
    } 

    @After 
    public void destroyDriver() throws Exception { 
     //Sleep call here for demo purposes only! 
     Thread.sleep(5000); 
     driver.close(); 
    } 

    @Test 
    public void testSignIn() { 
     driver.get("gmail.com"); 
     EmailEntryPage emailPage = PageFactory.initElements(driver, EmailEntryPage.class); 
     emailPage.enterEmailAddress(MY_EMAIL); 
     AccountPasswordPage passPage = PageFactory.initElements(driver, AccountPasswordPage.class); 
     passPage.enterPassword(MY_ACCOUNT_PASS); 
     PageWithSettings settingsPage = PageFactory.initElements(driver, PageWithSettings.class); 
     /* 
     * Now Do something with the drop-down 
     * 
     settingsPage.setDensityComfortable(); 
     settingsPage.setDensityCompact(); 
     settingsPage.setDensityCozy(); 
     settingsPage.configureInbox(); 
     settingsPage.openSettings(); 
     settingsPage.openThemes(); 
     settingsPage.openHelp(); 
     */ 
    } 
} 

Dies schien für mich zu arbeiten, aber ich habe gründlich den Code nicht testen. Es könnte Dinge geben, die ich übersehe. Firefox-Version 45.0.1

Hoffe, dass hilft.

+0

Vielen Dank für die Antwort Sir. Aber immer noch mit WebDriverWait, und PageFactory funktioniert es nicht –

+0

@SagarAjmire Ich verwendete Ihre Probe, um den Test der Anmeldung in Gmail neu zu erstellen und die Seiteneinstellungen zu öffnen. Mit einer aktualisierten Version von Firefox, Firepath und Firebug bekam ich einen anderen Wert für die Auflösung der Einstellungen. Ich füge meiner Antwort mehr Inhalt hinzu. – Jeremiah