我有一个网络项目,单击按钮导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面之一。(其中 2 个页面的 url 可能相同)
我有三个使用 PageObject 模型表示每个页面上的预期元素的类。
实际找到实际加载的页面的最佳方法是什么?是否有一种 OR 类型的等待,我可以等待三个独特的元素并获得实际加载的那个?
我有一个网络项目,单击按钮导航到另一个页面。根据服务器中的数据,新页面可以是三个可能页面之一。(其中 2 个页面的 url 可能相同)
我有三个使用 PageObject 模型表示每个页面上的预期元素的类。
实际找到实际加载的页面的最佳方法是什么?是否有一种 OR 类型的等待,我可以等待三个独特的元素并获得实际加载的那个?
我有一个类似的问题,我需要检测登录是否是针对新用户的(登录页面然后转到条款和条件页面,而不是直接转到主页)。
最初我只是等待然后测试第二页,但这只是一种痛苦,所以我想出了这个。
用这个测试结果:
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 或失败。我使用元组,以便我可以检测我在哪个屏幕上,在这种情况下同意条款和条件,然后让我回到我的正常页面路径
是的,可以检查唯一元素(标识页面)的存在,然后在框架中返回相应的页面。
但是,测试应该知道它接下来期望的页面,并且应该假设正确的页面已经加载并执行进一步的操作/断言。您甚至可以在此处放置一个断言来验证是否已加载正确的页面。如果加载了不同的页面,则测试最终会失败,因为断言会失败。这种方式测试变得更具可读性并描述了应用程序的流程。
此外,始终建议为测试预先设置测试数据。通过这种方式,您将知道服务器上有哪些数据可用,并且测试将知道将呈现哪个页面。