C# 使用webdriver PageFactory选择特定页面

C# 使用webdriver PageFactory选择特定页面,c#,webdriver,pageobjects,C#,Webdriver,Pageobjects,我有一个web项目,单击按钮可以导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面中的一个。其中两个页面的url可能相同 我有三个类使用PageObject模型表示每个页面上的预期元素 找到实际加载的页面的最佳方法是什么?是否有一种或类型的等待,我可以在三个唯一的元素上等待并获取实际加载的元素?是的,可以检查是否存在唯一的元素来标识页面,然后在框架中返回相应的页面 但是,测试应该知道它下一步所期望的页面,并且应该假设正确的页面已经加载并执行进一步的操作/断言。您甚至可以在这里放置一个

我有一个web项目,单击按钮可以导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面中的一个。其中两个页面的url可能相同

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


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

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

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


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

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

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

要使用此选项测试结果,请执行以下操作:

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或失败。
我使用一个元组,这样我就可以检测到我在哪个屏幕上,在这种情况下,我同意条款和条件,然后让我回到正常的页面路径上

在这种情况下,很难知道下一个页面是什么,由于应用程序使用OAuth并重新路由到OAuth提供程序,测试使用的用户帐户可能已经或可能还没有为该应用程序授予权限,因为用户池在不同的testsOk之间共享。如果是这种情况,我们必须编写C代码,在页面呈现后检查这些唯一元素是否存在,并返回相应的页面对象。