我刚开始为一个新的 WebApplication 实现一些 UItests,并注意到有时当我等待元素存在时测试会失败,而在等待元素可见时相同的测试会成功。
所以我的问题是,是否有固定的顺序使 web 元素变为“现有”、“可点击”、“可见”、“显示”等,或者这完全取决于开发人员如何实现网页或 JS 框架哪个用于实现应用程序?
我刚开始为一个新的 WebApplication 实现一些 UItests,并注意到有时当我等待元素存在时测试会失败,而在等待元素可见时相同的测试会成功。
所以我的问题是,是否有固定的顺序使 web 元素变为“现有”、“可点击”、“可见”、“显示”等,或者这完全取决于开发人员如何实现网页或 JS 框架哪个用于实现应用程序?
这完全取决于页面的编写方式。Web 元素不会从一种状态演变为另一种状态。它可能会发生变化,但由于某些动态内容、在页面上执行的操作等原因。
这些状态告诉我们什么:
driver.FindElement(By.Xpath(".//*"))
将找到页面上的所有元素。IWebElement.Displayed
(C# 语法)检查元素是否显示。如何检查元素是否存在?如果您只是在搜索元素,则在未找到元素时会抛出异常。我建议使用 WebDriverWait 在特定时间段内查找元素来处理加载:
Wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSecond));
Wait.Until(d => d.FindElement(by));
准确地说,Selenium可以处理HTML DOM中WebElement的3 种不同状态:
老实说,您不必跟踪 web 元素变为现有、可点击、可见、显示等的顺序。
如果您的用例是验证任何元素的存在,您需要诱导WebDriverWait将ExpectedConditions设置为ElementExists()
检查页面 DOM 上是否存在元素的期望。这并不一定意味着该元素是可见的。所以有效的代码行将是:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(ExpectedConditions.ElementExists(By.CssSelector("element_cssSelector")));
如果您的用例是提取任何元素的任何属性,则您需要诱导WebDriverWait将ExpectedConditions设置为ElementIsVisible(locator)
检查元素是否存在于页面的 DOM 上并且可见的期望。可见性意味着元素不仅被显示,而且具有大于 0 的高度和宽度。因此,在您的用例中,代码行将是:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(ExpectedConditions.ElementIsVisible(By.ClassName("element_classname")));
如果您的用例要在任何元素上调用click()
,您需要诱导WebDriverWait设置ExpectedConditions,因为ElementToBeClickable()
这是检查元素是否可见并启用的期望,以便您可以单击它。因此,在您的用例中,代码行将是:
new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("element_xpath"))).Click();