如何使用Selenium元素等待,检查,点击而不再找到元素?

时间:2016-11-09 18:28:15

标签: c# selenium selenium-webdriver

我是Selenium的新手,之前正在使用Telerik免费测试框架。问题是我无法理解,如何使用已经[FindsBy]识别的元素等待,检查并点击。

前:

    [FindsBySequence]
    [FindsBy(How = How.Id, Using = "container-dimpanel")]
    [FindsBy(How = How.CssSelector , Using = ".btn.btn-primary.pull-right")]
    public IWebElement UpdateButton { get; set; }

    internal void ClickUpdateButton(TimeSpan timeout)
    {
        new WebDriverWait(_driver, timeout).
            Until(ExpectedConditions.ElementIsVisible(By.CssSelector(id));
        UpdateButton.Click();
    }

我希望我的代码等待更新按钮可见,然后单击它。但我想传递UpdateButton元素而不是使用By选择器。

  • 不确定UpdateButton.Enabled是否会等到它可见。

3 个答案:

答案 0 :(得分:2)

接受WebElement的可见性存在预期条件: https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#visibilityOf-org.openqa.selenium.WebElement-

Until也会返回正在等待的元素,因此您可以将其合并为一行:

internal void ClickUpdateButton(TimeSpan timeout)
{
    WebDriverWait wait = new WebDriverWait(_driver, timeout);
    wait.Until(ExpectedConditions.visibilityOf(UpdateButton)).click();
}

然而,在我的框架中,我通常会添加一个辅助函数来执行此操作,因为它已经被大量使用了。你也可以做类似的事情,等到可点击等等,并且有接受WebElement或By的方法:

public WebElement waitThenClick(WebElement element) 
{
    WebDriverWait wait = new WebDriverWait(_driver, timeout);
    return wait.Until(ExpectedConditions.visibilityOf(UpdateButton)).click();
}

答案 1 :(得分:1)

C#客户端没有内置条件来检查代理WebElement的可见性。

此外,预期条件ExpectedConditions.ElementIsVisible会检查元素是否显示,但是从用户的角度来看,它不会检查元素是否可见。

所以最快最可靠的方法是重试服务员点击直到成功:

Click(UpdateButton, 5);
static void Click(IWebElement element, int timeout = 5) {
    var wait = new DefaultWait<IWebElement>(element);
    wait.IgnoreExceptionTypes(typeof(WebDriverException));
    wait.PollingInterval = TimeSpan.FromMilliseconds(10);
    wait.Timeout = TimeSpan.FromSeconds(timeout);
    wait.Until<bool>(drv => {
        element.Click();
        return true;
    });
}

答案 2 :(得分:0)

使用我编写的这个函数来测试一个元素,你可以直接传入这个名字。它将返回一个bool,你可以使用一个循环来等待元素出现。

static public bool verify(string elementName)
{
    try
    {
        bool isElementDisplayed = driver.FindElement(By.XPath(elementName)).Displayed;
        return true;
    }
    catch
    {
        return false;
    }
    return false;
}