2012-11-21 38 views
1

我有一个web项目,点击一个按钮导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面中的一个。 (这些网址的url可能相同)使用webdriver PageFactory选择特定页面

我有三个类表示使用PageObject模型的每个页面上的预期元素。

什么是真正找到哪个页面实际加载的最佳方式?有没有OR类型的等待,我可以在三个独特的元素上等待并获得实际加载的元素?

回答

0

是的,可以检查是否存在唯一元素(标识页面),然后返回框架中的相应页面。

但是,测试应该知道下一个期望的页面,并且应该假定正确的页面已经加载并执行进一步的操作/断言。你甚至可以在这里放置一个断言来验证正确的页面已经加载。如果加载了不同的页面,则测试最终会失败,因为断言会失败。 这种方式测试变得更具可读性并描述了应用程序的流程。

另外,为测试预先设置测试数据始终是可取的。这样你就可以知道服务器上有哪些数据可用,并且测试会知道哪个页面将呈现。

+0

在这种情况下,将会有点难知道下一个期望的页面,因为应用程序使用OAuth并重新路由到OAuth提供程序,并且由于用户池在不同的测试之间共享用户池,所以测试使用的用户帐户可能已经或可能未获得该应用程序的许可 – randomThought

+0

好的。如果是这样的话,我们必须编写C#代码来检查这些独特元素是否存在(页面已经呈现)并返回相应的页面对象。 –

0

我有类似的问题,我需要检测登录是否为新用户(登录页面然后转到条件&条件页面而不是直接到主页)。

最初我只是等待,然后测试第二页,但这只是一个痛苦,所以我想出了这个。

要与这个测试的结果:

var whichScreen = waitForEitherElementText(By.CssSelector(HeaderCssUsing), "HOME SCREEN", "home", terms.getHeaderLocator(), terms.headerText, "terms", driver, MAX_STALE_RETRIES); 

     if(whichScreen.Item1 && whichScreen.Item2 == "terms") 
     { 
      terms.aggreeToTerms(); 
     } 

,这个调用是方法:

protected Tuple<bool, string> waitForEitherElementText(By locator1, string expectedText1, string return1Ident, 
     By locator2, string expectedText2, string return2Ident, IWebDriver driver, int retries) 
    { 
     var retryCount = 0; 
     string returnText = ""; 
     WebDriverWait explicitWait = new WebDriverWait(driver, TimeSpan.FromSeconds(globalWaitTime)); 
     driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0.5)); 
     while (retryCount < retries) 
     { 
      try 
      { 
       explicitWait.Until<bool>((d) => 
       { 
        try 
        { 
         if (Equals(d.FindElement(locator1).Text, expectedText1)) { returnText = return1Ident; }; 
        } 
        catch (NoSuchElementException) 
        { 
         if (Equals(d.FindElement(locator2).Text, expectedText2)) { returnText = return2Ident; }; 
        } 
        return (returnText != ""); 
       }); 
       return Tuple.Create(true, returnText); 
      } 
      catch (StaleElementReferenceException e) 
      { 
       Console.Out.WriteLine(DateTime.UtcNow.ToLocalTime().ToString() + 
        ":>>> -" + locator1.ToString() + " OR " + locator2.ToString() + "- <<< - " + 
        this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + 
        " : " + e.Message); 
       retryCount++; 
      } 
     } 
     return Tuple.Create(false,""); 
    } 

的明确等到使用Boolean所以将循环周围满等待时间(我有一个非常慢的测试服务器,所以我把它设置为60秒)。隐式等待设置为半秒,所以元素测试将每半秒尝试一次并循环,直到返回true或返回失败。 我使用Tuple,以便我可以检测到我在哪个屏幕上,并且在这种情况下同意条款&然后将我设置回正常页面路径

相关问题