Selenium在第二次测试中没有识别元素

时间:2015-10-01 08:20:34

标签: java selenium testng elements

我尝试使用selenium + TestNG创建的每个测试脚本都会发生这种情况。 在第一个@test方法之后,webdriver永远不会识别其余@test方法上的元素,并始终将它们声明为失败。

为了简化以下情况: 网页驱动程序加载一个页面,在第一个@test(priority=0)它搜索谷歌登录按钮并单击它以加载谷歌登录屏幕。 在第二个@test(priority=1)我试图通过其ID识别电子邮件文本字段,但我总是得到一个未找到的元素的例外。 但是,如果我将代码从第二次测试移动到第一次测试,它就会成功执行

这是一段代码。 enterCredentials()方法是问题发生的地方。

public class CSgoogleLogin extends CloudDriver {

@Test(priority=0)
public void attemptLogin(){

    WebElement myDynamicElement = (new WebDriverWait(driver, 100))
              .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='ROOT-2521314']/div/div[2]/div/div[1]/div/div/div/center/div[3]/div[2]/div[1]/div/span/img")));
    driver.findElement(By.xpath("//*[@id='ROOT-2521314']/div/div[2]/div/div[1]/div/div/div/center/div[3]/div[2]/div[1]/div/span/img")).click();     
}

@Test(priority=1)
public void enterCredentials(){
    WebElement myDynamicElement;
    if(!driver.findElement(By.id("Email")).isDisplayed()){
     myDynamicElement = (new WebDriverWait(driver, 1))
              .until(ExpectedConditions.presenceOfElementLocated(By.id("Email")));
    }
    //Entering Username
    driver.findElement(By.id("Email")).sendKeys("xyz");
    driver.findElement(By.id("next")).click();

    myDynamicElement = (new WebDriverWait(driver, 1))
              .until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='Passwd']")));
    //Entering Password
    driver.findElement(By.id("Passwd")).sendKeys("xyz");
    driver.findElement(By.id("signIn")).click();
}}

以下是CloudDriver类。更重要的是,在运行调试时,代码可以正确执行。

public class CloudDriver {

protected WebDriver driver = null;

@BeforeSuite
public void setUP(){

    driver = new FirefoxDriver();
    driver.get("http://apps3.thecloudstream.com/");
}

@AfterSuite
public void Closing(){

    driver.quit();
}

}

2 个答案:

答案 0 :(得分:0)

你能否展示" CloudDriver"的代码?上课?

我没有看到任何查看当前代码的失败。你能尝试在@BeforeClass方法中设置驱动程序实例吗?如下所示:

public class CSgoogleLogin extends CloudDriver {
Webdriver driver = null;
@BeforeClass
public void setUp(){
driver = getDriverInstance();//Get this instance from the super class.
} 
@Test(priority=0)
public void attemptLogin(){}
@Test(priority=1)
public void enterCredentials(){}

答案 1 :(得分:0)

我通过应用隐式等待解决了这个问题。 即输入凭证

driver.manage().timeouts().implicitlyWait(3, TimeUnit.seconds);
    // Entering Username
    driver.findElement(By.xpath("//*[@id='Email']")).sendKeys(
            "daisy.d.bogus@gmail.com");
    driver.findElement(By.xpath("//*[@id='next']")).click();

隐式等待轮询dom给定时间,直到找不到相关元素或元素。