尝试StaleElementReferenceException尝试一次有效和一次无效登录

时间:2017-06-20 14:08:17

标签: selenium selenium-webdriver automation

我正在尝试在同一测试类中编写有效和无效登录的测试,但我收到的是StaleElementReferenceException。以下是代码

public class LoginTest {
    static{
        System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");
    }
    public static void main(String[] args) throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("http://app.meltwaterbuzz.com/");
        driver.manage().window().maximize();
        LoginPage login = new LoginPage(driver);
        System.out.println(driver.getTitle());
        login.setUsername("username");
        login.setPassword("password");
        login.clickSignIn();
        login.setUsername("username");
        login.setPassword("password");
        login.clickSignIn();
        System.out.println(driver.getTitle());

        //driver.close();
    }
}

知道怎么处理这个吗?

3 个答案:

答案 0 :(得分:2)

一般来说,如果在启动webelement之后更改了元素属性或某些内容,我们将获得Stale Exception。例如,在某些情况下,如果用户尝试在同一页面上单击同一元素但在页面刷新后,则会获取staleelement异常。

为了解决这个问题,我们可以创建新的webelement,以防页面被更改或刷新。下面的代码可以给你一些想法。

示例:

webElement element = driver.findElement(by.xpath("//*[@id='StackOverflow']"));
element.click();
//page is refreshed
element.click();//This will obviously throw stale exception

为了解决这个问题,我们可以将xpath存储在某个字符串中,然后使用它来创建一个新的webelement。

String xpath = "//*[@id='StackOverflow']";
driver.findElement(by.xpath(xpath)).click();
//page has been refreshed. Now create a new element and work on it
driver.fineElement(by.xpath(xpath)).click();   //This works

希望这会对你有所帮助。感谢。

答案 1 :(得分:0)

以下是您的问题的答案:

在您的代码块中,您正在创建login类的LoginPage对象,填满usernamepassword并点击SignIn按钮。单击SignIn按钮后,您将以注册用户身份登录并重定向到新页面。这里的页面/网址已经改变,HTML DOM也发生了变化。

接下来,您再次尝试通过login.setUsername("username")再次传递用户名,Selenium无法在此新页面上找到相同的定位器(id / name / css / xpath)。因此,Selenium抱怨StaleElementReferenceException这实际上意味着您正在寻找的定位器不再出现在HTML DOM上或已成为stale

您的问题的解决方案是Logout,然后再次返回初始网址http://app.meltwaterbuzz.com/

如果这回答了您的问题,请告诉我。

答案 2 :(得分:0)

我找到了克服StaleElementReferenceException的方法,如果我们使用页面对象模型,那么我们就可以克服它。这是一个例子。

POM课程

public class LoginPage {
//declaration
@FindBy(id="username")
private WebElement usernameTxt;

@FindBy(name = "pwd")
private WebElement passwordTxt;

@FindBy(css="#loginButton")
private WebElement loginBTN;
//Initialization
public LoginPage(WebDriver driver) {
    PageFactory.initElements(driver, this);
}
//Utilization
public void setUserName(String un) {
    usernameTxt.sendKeys(un);
}

public void setPassword(String pw) {
    passwordTxt.sendKeys(pw);
}

public void clickLogin() {
    loginBTN.click();
}

}

测试类

public class LoginTest {
public static void main(String[] args) throws InterruptedException {
    System.setProperty("webdriver.chrome.driver", "./driver/chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.get("http://localhost/login.do");
    LoginPage login = new LoginPage(driver);

    login.setUserName("zahid");
    login.setPassword("manager");
    login.clickLogin();
    Thread.sleep(2000);
    login.setUserName("admin");
    login.setPassword("manager");
    login.clickLogin();
}

}