Webdriver如何等待元素在webdriver C#中可单击

时间:2013-04-17 09:56:18

标签: c# webdriver selenium-webdriver

在浏览器中生成元素后,有一个块Ui覆盖所有元素几秒钟,因为我面临一个问题,因为元素已经存在,web驱动程序尝试单击元素但是Block UI收到点击。 我曾尝试使用wait Until但我没有帮助,因为我可以在C#webdriver中找到isClickAble

   var example = _wait.Until<IWebElement>((d) => d.FindElement(By.XPath("Example")));
   var example2 = _wait.Until<IWebElement>(ExpectedConditions.ElementIsVisible(By.XPath("Example")));
example.click();
example2.click();

isClickAble是否等效C#,提前谢谢

4 个答案:

答案 0 :(得分:31)

好好看一下Java源代码,告诉我它基本上做了两件事来确定它是否是“可点击的”:

https://code.google.com/p/selenium/source/browse/java/client/src/org/openqa/selenium/support/ui/ExpectedConditions.java

首先,它会使用标准ExpectedConditions.visibilityOfElementLocated检查它是否“可见”,然后只需检查element.isEnabled()是否为true

这可以稍微压缩,这基本上意味着(简化,在C#中):

  1. 等到元素从DOM返回
  2. 等到元素的.Displayed属性为true(基本上是visibilityOfElementLocated正在检查的内容)。
  3. 等到元素的.Enabled属性为真(这基本上是elementToBeClickable正在检查的内容)。
  4. 我会像这样实现它(添加到当前的ExpectedConditions集合,但有多种方法可以实现:

    /// <summary>
    /// An expectation for checking whether an element is visible.
    /// </summary>
    /// <param name="locator">The locator used to find the element.</param>
    /// <returns>The <see cref="IWebElement"/> once it is located, visible and clickable.</returns>
    public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator)
    {
        return driver =>
        {
            var element = driver.FindElement(locator);
            return (element != null && element.Displayed && element.Enabled) ? element : null;
        };
    }
    

    可用于:

    var wait = new WebDriverWait(driver, TimeSpan.FromMinutes(1));
    var clickableElement = wait.Until(ExpectedConditions.ElementIsClickable(By.Id("id")));
    

    但是,您可能对可点击的含义有不同的看法,在这种情况下,此解决方案可能无效 - 但它是Java代码正在执行的操作的直接转换。

答案 1 :(得分:2)

这是我用来检查它是否可点击的代码,否则转到另一个URL。

if (logOutLink.Exists() && ExpectedConditions.ElementToBeClickable(logOutLink).Equals(true))
            {
                logOutLink.Click();
            }
            else
            {
                Browser.Goto("/");
            }

答案 2 :(得分:1)

如果您遇到问题,例如&#34;另一个元素会收到点击&#34;,解决此问题的方法是使用等待覆盖框消失的while循环。

//The below code waits 2 times in order for the problem element to go away.
int attempts = 2;
var elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
while (attempts > 0 && elementsWeWantGone.Count > 0)
{
    Thread.Sleep(500);
    elementsWeWantGone = WebDriver.FindElements(By.Id("id"));
}

答案 3 :(得分:0)

在速度较慢的测试运行器计算机上,似乎首先可以找到输入元素,但是在脚本尝试向输入控件发送键或单击时,仍然无法单击输入元素。等待“ ElementToBeClickable”的帮助。更快,功能更强大的测试运行器系统几乎没有这个问题。

这是带有一些上下文的代码,在基于C#的Selenium测试中似乎有所改进。还使用SpecFlow和xUnit。我们正在使用IE11和IEDriverServer.exe。

截至2019年5月,包含此内容的NuGet软件包是DotNetSeleniumExtras.WaitHelpers。

关键在于这一点:

wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(通过...

使用指向您要与之交互的第一个输入字段的选择器,对新页面上的第一个输入字段执行此操作。 (通过XPath(“”)

[Given(@"I have selected the link to the OrgPlus application")]
public void GivenIHaveSelectedTheLinkToTheOrgPlusApplication()
{
    _driver.Navigate().GoToUrl("http://orgplus.myorg.org/ope?footer");
}

[Given(@"I have selected the link to the OrgPlus Directory lookup")]
public void GivenIHaveSelectedTheLinkToTheOrgPlusDirectoryLookup()
{
    var wait = new WebDriverWait(_driver, new TimeSpan(0, 0, 30));
    var element = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id=\"lnkDir\"]")));
    IWebElement btnSearch = _driver.FindElement(By.XPath("//*[@id=\"lnkDir\"]"));
    btnSearch.SendKeys(Keys.Enter);
}