0

我刚开始为一个新的 WebApplication 实现一些 UItests,并注意到有时当我等待元素存在时测试会失败,而在等待元素可见时相同的测试会成功。

所以我的问题是,是否有固定的顺序使 web 元素变为“现有”、“可点击”、“可见”、“显示”等,或者这完全取决于开发人员如何实现网页或 JS 框架哪个用于实现应用程序?

4

2 回答 2

0

这完全取决于页面的编写方式。Web 元素不会从一种状态演变为另一种状态。它可能会发生变化,但由于某些动态内容、在页面上执行的操作等原因。

这些状态告诉我们什么:

  1. Existing - 当元素在页面 DOM 中时。它不一定必须是可见的或可交互的。它是基本状态,因为元素不能有其他状态,没有存在。使用driver.FindElement(By.Xpath(".//*"))将找到页面上的所有元素。
  2. Displayed - 当元素存在时,它可能是可见的。使用IWebElement.Displayed(C# 语法)检查元素是否显示。
  3. 可点击 - 有时当您尝试点击元素时,可能会抛出异常,表示其他东西会获得点击。要处理这些问题,请参阅此答案

如何检查元素是否存在?如果您只是在搜索元素,则在未找到元素时会抛出异常。我建议使用 WebDriverWait 在特定时间段内查找元素来处理加载:

Wait = new WebDriverWait(driver, new TimeSpan(0, 0, timeoutSecond));
Wait.Until(d => d.FindElement(by));
于 2019-12-19T13:45:28.487 回答
0

准确地说,Selenium可以处理HTML DOM中WebElement的3 种不同状态:

  • 元素存在,即存在
  • 元素是可见的。
  • 元素是交互式/可点击的。

老实说,您不必跟踪 web 元素变为现有可点击可见显示等的顺序。

  • 如果您的用例是验证任何元素的存在,您需要诱导WebDriverWaitExpectedConditions设置为ElementExists()检查页面 DOM 上是否存在元素的期望。这并不一定意味着该元素是可见的。所以有效的代码行将是:

    IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(ExpectedConditions.ElementExists(By.CssSelector("element_cssSelector")));
    
  • 如果您的用例是提取任何元素的任何属性,则您需要诱导WebDriverWaitExpectedConditions设置为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();
    
于 2019-12-19T13:45:58.873 回答