2017-06-20 58 views
0

我想在同一個測試類中編寫有效和無效登錄的測試,但我得到StaleElementReferenceException。以下是密碼獲取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

你能告訴了哪一行代碼你得到的例外。 – Alok

回答

0

這裏是回答你的問題:

在你的代碼塊,你創建了一個對象LoginPagelogin,填補了usernamepassword和你點擊SignIn按鈕。一旦您點擊SignIn按鈕,您將以註冊用戶身份登錄並重定向到新頁面。這裏頁面/網址已經改變,HTML DOM也改變了。

接下來,您再次嘗試再次通過login.setUsername("username")傳遞用戶名,Selenium無法在此新頁面上找到相同的定位器(id/name/css/xpath)。因此Selenium抱怨StaleElementReferenceException這基本上意味着您正在尋找的定位符不再出現在HTML DOM上或已成爲stale

您的問題的解決方案將是Logout並再次返回到初始url http://app.meltwaterbuzz.com/

讓我知道這個答案是否是您的問題。

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 

希望這可以幫助你。謝謝。

+0

是的,如果我們試圖再次找到元素,那麼肯定會起作用,但是相同的代碼會重複多次。 –

+0

我沒有找到你@ZahidAfaque –

+0

你不應該把這當成代碼重複,@santhosh kumar是對的。這是最佳做法。在頁面初始化時加載所有元素可能會減少與dom的交互,但出於很多原因,除非您搞亂了靜態網頁,否則效率不高。交互後動態內容自然會發生變化。 添加手動等待是最好的解決方案,如下面的答案。除非必須,否則不要這樣做。 –

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(); 
} 

}