2017-06-20 15 views
0

同じテストクラスで有効なログインと無効なログインのテストを作成しようとしていますが、StaleElementReferenceExceptionが発生しています。コードは以下にありますStaleElementReferenceExceptionを取得すると有効なログインと無効なログインが1つ試行されます

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

は、あなたの質問への答えです:

あなたのコードブロックでは、あなたが、LoginPageクラスのオブジェクトを作成loginusernameを埋め、passwordあなたがSignInボタンをクリックされています。 SignInボタンをクリックすると、登録ユーザーとしてログインし、新しいページにリダイレクトされます。ここでは、ページ/ URLが変更され、HTML DOMも変更されています。

login.setUsername("username")から再度ユーザ名を渡そうとしています。この新しいページでは、Seleniumは同じロケータ(id/name/css/xpath)を見つけることができません。したがって、SeleniumはStaleElementReferenceExceptionという文句を言っています。これは、あなたが探しているロケータがHTML DOMに存在していないこと、またはstaleになっていることを意味します。

解決策はLogoutになり、最初のURL http://app.meltwaterbuzz.com/に戻ります。

これはあなたの質問に答えます。

2

一般に、要素の属性などがweb要素を開始した後に変更された場合、古くなった例外が発生します。たとえば、ユーザーが同じページ上の同じ要素をクリックしようとしたが、ページを更新した後で、staleelement例外が発生する場合があります。

これを解決するには、ページが変更または更新された場合に新しいWeb要素を作成することができます。以下のコードはあなたにいくつかのアイデアを与えることができます。

例:

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とのやりとりが減少する可能性がありますが、静的なWebページを使用しない限り、効率的ではありません。ダイナミックなコンテンツは、インタラクションの後に自然に変化します。 手動待機を追加すると、以下のように最悪の解決策になります。あなたがしなければならない限り、決してしないでください。 –

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

}

関連する問題