首页 > 解决方案 > 如何使用 C# 和 Appium 检查 WebElement 是否不存在并抛出正确的错误

问题描述

我有一个代码,通过它的 ID 检查页面上是否存在 AppiumWebElement(我正在检查预期元素的列表,我希望看到页面上没有任何这些元素丢失)。当元素存在时 - 它工作正常。但是如果元素不存在 - 它会抛出我:

OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://127.0.0.1:4723/wd/hub/session/92e77b3a-d69b-4261-9ade-59621875206a/element/7.2308.43816588/element timed out after 60 seconds.

我想得到一些更有意义的东西,比如“ Element XXX 不存在/找不到”,而不是 TimeOut。

我尝试了两种方法:

  1. private static bool RowsContainCorrectColumns(IEnumerable<AppiumWebElement> rows, IList<string> columnsIdsList)
    {
    var firstRow = rows.FirstOrDefault();
    
        if (columnsIdsList.Any())
    {
        foreach (var id in columnsIdsList)
        {
            try
            {
                firstRow.FindElementByAccessibilityId(id);
            }
            catch (NoSuchElementException)
            {
                return false;
            }
        }
    }
    
    return true;
    

    }

  2. private static bool RowsContainCorrectColumns(IEnumerable<AppiumWebElement> rows, IList<string> columnsIdsList)
    {
    var firstRow = rows.FirstOrDefault();
    
        if (columnsIdsList.Any())
    {
        foreach (var id in columnsIdsList)
        {
            if (!firstRow.FindElementByAccessibilityId(id).Displayed)
            {
                return false;
            }
        }
    }
    return true;
    

    }

使用 RowsContainCorrectColumns 的方法:

public static void AssertRowsContainCorrectColumnsById<T>(this ReportsTestFixture fixture, IEnumerable<string> columnsIds) where T : ViewCommonControls, new()
        {
            (
                    from view in fixture.MainWindow.InitializeView<T>()
                    from rows in Result.Try(() => view.DataGridControl.FindElementsByClassName("DataRow"))
                    select RowsContainCorrectColumns(rows, columnsIds)
                )
                .Should().BeSuccessful()
                .AndSuccessValue.Should().BeTrue();
        }

标签: c#selenium-webdriverappium

解决方案


您可以获取元素的列表,然后检查列表的大小是否大于零。如果 size>0 则元素存在于页面上,否则不存在。
你可以这样做:

IList<IWebElement> elementList = driver.FindElements(By.Id("put the id here"));
if(elementList.Count>0)
{
    // Element is present
}
else
{
    // Element is not present
}

推荐阅读