【发布时间】:2019-09-28 01:18:44
【问题描述】:
我开始使用 Selenium 来测试我构建的 React 应用程序。
在大多数简单的 JavaScript 应用程序中,连接一个测试是微不足道的,其中使用 WebDriverWait 类等待某个事件表明测试可以继续下一步。
例如:
using (IWebDriver driver = new ChromeDriver())
{
driver.Navigate().GoToUrl($"{Properties.Settings.Default.ApplicationUrl}/Dashboard");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => d.Title.StartsWith("dashboard", StringComparison.OrdinalIgnoreCase));
//Can do next thing....
Assert.IsTrue(true);
}
但是,如果我们想要测试一个 React 应用程序,事情会变得有点复杂。鉴于 React 应用程序中的每个组件将各自单独调用their own lifecycle events,因此很难知道给定控件何时完成其Render() 生命周期。
我玩过一个简单的解决方案,例如:
//Add something like this to each React component
componentDidMount() {
if (!window.document.hasMyComponentMounted)
window.document.hasMyComponentMounted = true;
}
然后我可以在我的测试中做这样的事情:
using (IWebDriver driver = new ChromeDriver())
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
driver.Navigate().GoToUrl($"{Properties.Settings.Default.ApplicationUrl}/Dashboard");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(d => js.ExecuteScript("return window.document.hasHomeMounted"));
//Can do next thing....
Assert.IsTrue(true);
}
但这似乎是一个糟糕的解决方案。
有没有人遇到过同样的问题或知道潜在的解决方法(除了只使用Thread.Sleep())?
【问题讨论】:
-
一般来说,您只需等待某些条件成立。如果事件从不更新 DOM,那么你就必须像你在这里做的那样做。如果在您的超时期限内未满足条件,WebDriverWait 将引发超时,如果发现项目但由于尚未完成的客户端循环而正在更改,则将引发陈旧元素异常。 (在这种情况下再次调用......)
-
我建议你使用 Cypress 而不是 Selenium。 Cypress 有一些强大的功能,其中之一是docs.cypress.io/api/commands/route.html#Syntax。唯一的缺点是你必须用 javascript、jquery 编写代码,我想这根本不是问题
标签: c# reactjs selenium selenium-webdriver