我正在尝试在同一测试类中编写有效和无效登录的测试,但我收到的是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();
}
}
知道怎么处理这个吗?
答案 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
对象,填满username
,password
并点击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();
}
}