【问题标题】:Using webdriver PageFactory to pick certain page使用 webdriver PageFactory 选择特定页面
【发布时间】:2012-11-21 02:51:12
【问题描述】:

我有一个网络项目,点击一个按钮可以导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面之一。 (其中 2 个页面的 url 可能相同)

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

真正找到实际加载的页面的最佳方法是什么?是否有一种 OR 类型的等待,我可以在三个唯一元素上等待并获取实际加载的那个?

【问题讨论】:

    标签: c# webdriver pageobjects


    【解决方案1】:

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

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

    此外,始终建议为测试预先设置测试数据。这样您就可以知道服务器上有哪些数据可用,并且测试会知道要呈现哪个页面。

    【讨论】:

    • 在这种情况下,要知道下一个页面会有点困难,因为应用程序使用 OAuth 并重新路由到 OAuth 提供者以及测试使用的用户帐户可能已经或可能还没有已授予该应用程序的权限,因为用户池在不同测试之间共享
    • 好的。如果是这种情况,我们必须编写 C# 代码来检查这些唯一元素的存在(发布页面已呈现)并返回相应的页面对象。
    【解决方案2】:

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

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

    用这个来测试结果:

    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,"");
        }
    

    显式等待直到使用布尔值,因此将循环整个等待时间(我有一个非常慢的测试服务器,所以我将其设置为 60 秒)。隐式等待设置为半秒,因此元素测试将每半秒尝试一次并循环直到返回 true 或失败。 我使用元组,以便我可以检测我在哪个屏幕上,在这种情况下同意条款和条件,然后让我回到我的正常页面路径

    【讨论】:

      猜你喜欢
      • 2012-01-14
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多