2017-08-09 196 views
0

在設置此問題之前,我已經查看了StaleElementReference Exception in PageFactory,並且沒有任何答案似乎解決了我的問題。在刷新頁面後,硒不能再點擊按鈕

我有問題解決錯誤消息

OpenQA.Selenium.StaleElementReferenceException:陳舊元件 參考:元件未連接到頁文檔。

我確切地知道是什麼導致問題,但無法找到解決它的方法。

代碼如下,但作爲概述。

  1. 我去給帳戶
  2. 更新地址欄,然後單擊地址更新按鈕,
  3. 刷新瀏覽器,
  4. 確認該地址已經被更新。

然後我通過重新輸入原始地址數據進行清理。但是,當我嘗試點擊更新地址按鈕時,它顯示爲不再附加到頁面(雖然它是可見的)。我正在使用Page Factory Model作爲我的框架。我明白,要解決這個錯誤,我需要再次找到元素,但我無法解決如何做到這一點。無論我使用什麼方法,我都需要能夠將其應用於整個框架,因爲我有一種直覺,它會在我正在測試的網站上反覆出現。

我的代碼

測試引發錯誤。

[Test] 
public void Change_Account_Address() 
{ 
    Page.headerView.ClickOnLogin(); 
    Page.loginPage.EnterUserNameandPasword(_testName); 
    Page.accountPage.ConfirmAtAccountPage(_testName); 
    Page.accountPage.UpdateAccountAddress(_testName); 
    Browsers.Refresh(); 
    Page.accountPage.ConfirmAddressisUpdated(_testName); 
    Page.accountPage.UpdateAccountAddress("ResetAccountAddress"); - Error occurs on this step. 
    Page.accountPage.LogOut(); 
} 

帳戶頁面的按鈕,導致錯誤

[FindsBy(How = How.CssSelector, Using = "#myAccountForm > div:nth-child(3) > button")] 
[CacheLookup] 
private IWebElement UpdateDetails { get; set; } 

使用該按鈕在測試

public void UpdateAccountAddress(string testName) 
{ 
    var testData = ExcelDataAccess.GetTestData(testName); 
    AddressLine1.EnterText(testData.AddressLine1, "AddressLine1"); 
    AddressLine2.EnterText(testData.AddressLine2, "AddressLine2"); 
    AddressLine3.EnterText(testData.AddressLine3, "AddressLine3"); 
    City.EnterText(testData.City, "City"); 
    AccountPostcode.EnterText(testData.AccountPostcode, "AccountPostcode"); 
    UpdateDetails.ClickOnIt("UpdateButton"); 

} 

點擊它擴展

public static void ClickOnIt(this IWebElement element, string elementName) 
{ 
    element.Click(); 
    Console.WriteLine("Clicked on " + elementName); 
} 

最後我的頁面類

public class Page 
{ 
    private static T GetPage<T>() where T : new() 
    { 
     var page = new T(); 
     PageFactory.InitElements(Browsers.getDriver, page); 
     return page; 
    } 

    public static AccountPage accountPage 
    { 
     get 
     { 
      return GetPage<AccountPage>(); 
     } 
    } 
} 
+0

您是否嘗試在元素之前加入一些等待方法(** Update **按鈕在這裏)? –

+0

[PageFactory中的StaleElementReference異常]的可能重複(https://stackoverflow.com/questions/44838538/staleelementreference-exception-in-pagefactory) – DebanjanB

+0

雖然https://stackoverflow.com/questions/44838538/staleelementreference-exception-in -pagefactory是一個類似的問題,非該頁面上顯示的解決方案正在爲我工​​作。 –

回答

0

試試這個基本的東西

public static void ClickOnIt(this IWebElement element, string elementName) 
{ 
    Thread.sleep(3000); // sleep for 3 seconds 
    element.Click(); 
    Console.WriteLine("Clicked on " + elementName); 
} 

然後用Expicit等待而不是睡眠方法並不建議這樣做。

+0

添加線程睡眠已經奏效,但是在更新details.quot之前添加它。點擊clickonit遍佈我的框架,並且不想爲每個測試添加時間。也設法把它歸結爲Thread.Sleep(75);將有一個看看,看看是否有更好的方式來解決這個問題,而不使用線程睡眠,因爲我真的不喜歡在我的測試中使用它 –