2015-02-06 359 views
0

我在我的硒測試中使用PageFactory。我在等待加載頁面時遇到了一個問題。我不是在談論關於頁面加載超時的頁面上的元素。 所以,我有類似下面的方法:使用PageFactory等待頁面加載C#

public MyProjectsPage ClickSaveAndCloseButton() 
     { 
      //Do something and click a button 
      SaveAndCloseButton.Click(); 

      return new MyProjectsPage(Driver); //return new page 
     } 

,當我在等待返回新PageObject(在我的情況下,它是「MyProjectsPage」)我有一個超時異常。那麼,我可以在哪裏設置頁面加載超時?

實際的錯誤是這樣的:

AutomatedTests.FrontEnd.SouvenirProduct.SouvenirTestExecution.OrderSouvenirWithAuthorization(ByCash,Pickup,True,Cup): 
OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7585/session/b68c04d1ead1fc78fe083e06cbece38f/element/0.46564483968541026-14/click timed out after 60 seconds. 
    ----> System.Net.WebException : The operation has timed out 

我: 最新版本的webdriver的 而ChromeDriver的最新版本和Chrome瀏覽器 這個錯誤的最新版本,上面是apears INT下一行:

return new MyProjectsPage(Driver); //return new page 

創建我ChromeDriver接下來方式:

public DriverCover(IWebDriver driver) 
     { 
      _driver = driver; 
      _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 
     } 

     private readonly IWebDriver _driver; 
+0

什麼行是拋出呢?什麼版本的Selenium?什麼瀏覽器?該瀏覽器的哪個版本?你是如何創建驅動程序的?請更多代碼! – Arran 2015-02-06 14:16:16

+0

我在帖子中添加了更多信息。但瀏覽器和其他東西的版本並不重要。我在問如何設置一段時間來等待頁面加載。現在是60秒(因爲我的錯誤告訴我),我想增加它。如何?) – 2015-02-06 14:47:34

+0

「MyProjectsPage」的構造函數是什麼樣的? – Arran 2015-02-06 15:06:51

回答

1

1注意考慮頁面上的等待機制: 接受幾個webElements並申請它們fluentWait()。這將是顯式等待 webdriver方法。

另一種方法是嘗試隱含等待,如:

int timeToWait=10; 
driver.manage().timeouts().implicitlyWait(timeToWait, TimeUnit.SECONDS); 

考慮您pageObject代碼: 我會推薦你​​以下幾點:

MyPage myPageInstance= PageFactory.initElements(driver, MyPage.class); 

那麼你就寫了下面的方法:

public MyPage clickSaveAndOtherActions(MyPage testPageToClick) 
     { 
      testPageToClick.clickFirstButton(); 
      testPageToClick.clickSecondButton(); 
      testPageToClick.closePoPup(); 


      return testPageToClick; //return page in a new state 
    } 

,如果你想繼續工作(我的意思是更新頁面狀態),再執行以下操作:

myPageInstance = clickSaveAndOtherActions(myPageInstance); 

希望這有助於你。謝謝。

UPD:我從日誌中看到的東西看起來錯remoteWebdriver服務器:

OpenQA.Selenium.WebDriverException:HTTP請求到遠程 webdriver的服務器URL http://localhost:7585/session/b68c04d1ead1fc78fe083e06cbece38f/element/0.46564483968541026-14/click 60秒後超時。 ----> System.Net.WebException: 操作已超時

此外,我建議你仔細檢查你的驅動程序方法初始化。我用下面這段的Java代碼驅動程序的init(UI,鉻例如,硒電網+樞紐節點測試架構):

public static WebDriver driverSetUp(WebDriver driver) throws MalformedURLException { 
     DesiredCapabilities capability = DesiredCapabilities.chrome(); 
     log.info("Google chrome is selected"); 
     //System.setProperty("webdriver.chrome.driver", System.getProperty("user.home")+"/Documents/Tanjarine/chromedriver"); 
     System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); 
     capability.setBrowserName("chrome"); 
     capability.setPlatform(org.openqa.selenium.Platform.WINDOWS); 


     String webDriverURL = "http://" + environmentData.getHubIP() + ":" + environmentData.getHubPort() + "/wd/hub"; 
     driver = new RemoteWebDriver(new URL(webDriverURL), capability); 
     driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 
     driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 
     driver.manage().window().setSize(new Dimension(1920, 1080)); 

     return driver; 

    } 
+0

你發佈的所有代碼都是用Java編寫的。原帖提示C# – 2015-02-06 12:11:32

+0

@TidusJar談談的是關於webDriver的wait/pageFactory; java/C#是一種實現方式,從實現的角度來說,它具有密切的語義;-) – 2015-02-06 14:49:44

1

什麼用PageFactory模式,當你真正應該做的是初始化時你的頁面應該使用構造函數來初始化元素。

public MyProjectsPage ClickSaveAndCloseButton() 
{ 
     //Do something and click a button 
     //I am guessing this is taking you to the MyProjectsPage 
     SaveAndCloseButton.Click(); 

     return new MyProjectsPage(Driver); //return new page 
} 


public class MyProjectsPage 
{ 

    [FindsBy(How = How.Id, Using = "yourId")] 
    public IWebElement AWebElement { get; set; } 

    private IWebDriver WebDriver; 

    public MyProjectsPage (IWebDriver webDriver) 
    { 
     WebDriver = webDriver; 
     PageFactory.InitElements(WebDriver, this); 
    } 

} 

當您返回的頁面,使用FindsBy屬性的所有元素將被初始化。

更新:

設定這個屬性上,當你初始化它的驅動程序:

WebDriver.Manage().Timeouts().SetPageLoadTimeout(timespan) 
+0

我沒有元素的問題。由於整個頁面加載時間過長,因此無法加載它們。我會按照您的建議初始化我的元素,但這不是問題。 – 2015-02-06 13:55:25

+0

需要加載多長時間的頁面,您是在本地運行測試還是使用GRID服務器? – 2015-02-06 13:56:40

+0

我在本地運行它們。加載多長時間我不知道,但我的司機等待時間超過60秒 – 2015-02-06 14:40:12

0
// Wait Until Object is Clickable 
    public static void WaitUntilClickable(IWebElement elementLocator, int timeout) 
    { 
     try 
     { 
      WebDriverWait waitForElement = new WebDriverWait(DriverUtil.driver, TimeSpan.FromSeconds(10)); 
      waitForElement.Until(ExpectedConditions.ElementToBeClickable(elementLocator)); 
     } 
     catch (NoSuchElementException) 
     { 
      Console.WriteLine("Element with locator: '" + elementLocator + "' was not found in current context page."); 
      throw; 
     } 
    } 

    // Wait For Page To Load 
    public static void WaitForPage() 
    { 
     new WebDriverWait(DriverUtil.driver, MyDefaultTimeout).Until(
      d => ((IJavaScriptExecutor)d).ExecuteScript("return document.readyState").Equals("complete")); 
    }