2015-02-06 129 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")); 
    }