Selenium C#使用PageObject检查IWebElement是否存在

时间:2017-07-21 12:45:19

标签: c# selenium automation pageobjects

目标:使用PageObjects检查当前页面上是否存在元素/ IWebElement。

我知道您可以使用以下内容:

IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(3));
IWebElement element = wait.Until(ExpectedConditions.ElementExists(By.Id("foo")));

但是当我使用PageObjects时,我不想再次使用id / xpath等。我目前正在使用下面的方法来检查元素是否存在。但要快速执行此操作,我首先设置隐式等待,然后将其重置为默认值。它工作得很好,但感觉很脏。

我发现了其他一些较老的帖子。但这还没有为我提供任何解决方案。希望你能帮忙!

PageObject:

        [FindsBy(How = How.Id, Using = "errorMessage")]
    public IWebElement btnSubmit { get; set; }

调用方法:

CheckElementExists(errorMessage))

方法;

public bool CheckElementExists(IWebElement pageObject)
    {
        Browser.getDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(100);
        try
        {
            return pageObject.Equals(pageObject);
        }
        catch (NoSuchElementException)
        {
            return false;
        }
        finally
        {
            Browser.getDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);
        }
    }

3 个答案:

答案 0 :(得分:0)

我没有C#的经验,但我认为它与JAVA非常相似,因此您可以在C#中转换以下JAVA代码。

如果想要编写函数来检查元素是否存在,这就是你可以做到的。

public boolean isElementExisit(WebElement element){
    try{
        element.getTagName();
        return true;
    }catch (NoSuchElementException){
        return false;
    }
}

如果你想写一些需要等待的东西,那么你可以使用流利的等待。

public void waitUntilElementIsPresent(WebElement element, int timeout){
        Wait wait = new FluentWait<WebDriver>(driver)
                .withTimeout(timeout, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        wait.until(new Function() {
            @Override
            public Boolean apply(Object o) {
                element.getTagName();
                return true;
            }
        });
    }

答案 1 :(得分:0)

您应该可以根据您要使用的FindElement在试用版中执行id。如果它找到了,那么它将继续返回true,但如果它抓住了NoSuchElementException,那么它将返回false

bool CheckIfItExists(string ElementId)
{
    try
    {
        driver.FindElement(By.Id(ElementId));
        return true;
    }
    catch (NoSuchElementException)
    {
        return false;
    }
}

答案 2 :(得分:0)

要断言元素的存在,请使用C#和NUnit

Assert.IsTrue(
  btnSubmit.Displayed,
  "Submit button should be displayed"
);

要断言元素的缺失,我真的很喜欢NUnit's Assert.throw语法。

Assert.Throws<NoSuchElementException>(
  () => btnSubmit.Contains(""),
  "Accessing Submit button should throw NoSuchElementException"
);