如何等待首先使用 Selenium 显示多个元素之一?

How to wait for one of multiple elements to be displayed first using Selenium?

我对 Selenium 很陌生,所以我正在寻找一些关于如何实现这一点的见解。

本质上,我希望我的驱动程序等待多个元素之一可见。这是因为网站在使用自动化时可能会产生混合结果,所以我想将其视为“错误处理”(如果这有意义的话)。

基本上,如果元素 a 首先可见,则执行此操作。但是,如果元素 b 先可见,则执行此操作。

我如何使用适用于 C# 的 Selenium webdriver 实现此目的?我读到使用“|”组合元素的 XPath 值有效,但是当我在我的应用程序中尝试时,我没有运气。

非常感谢任何答案!提前致谢!

对我来说这有点困难,因为您的元素可能会在一瞬间彼此显示。想知道你是否可以把它放在一个箱子里,当你拿到一个时就坏了?

所以我在想的是先查看该元素是否存在。

        public static bool IsElementPresent_byXpath(string xpath)
    {
        bool result;
        try { result = Driver.FindElement(By.XPath(xpath)).Displayed; }
        catch (NoSuchElementException) { return false; }
        catch (StaleElementReferenceException) { return false; }
        return result;
    }

因此,如果您这样做,那么您可以编写类似下面的内容,但我担心的是,如果页面没有更改,则可以调用 ele1、ele2 和 ele3。所以这段代码需要修改。

        bool ele1 = Browser.IsElementPresent_byXpath("//[@id='1']");

        bool ele2 = Browser.IsElementPresent_byXpath("//[@id='2']");

        bool ele3 = Browser.IsElementPresent_byXpath("//[@id='3']");

        if (ele1)
        {
            //do this
        }
        else if (ele2 || ele1 == false)
        {
            //do this
        }

        else if (ele3 || ele1 == false ||  ele2 == false)
         {
            //do this
        }

我会选择 Wait.Until,这样我就可以将等待和设置事件超时的好处结合起来,并返回匹配的定位器,这样我就可以将我的逻辑建立在结果的基础上。

这是 java 代码,但 C# 有等效代码。

假设我正在等待 firstBysecondBythirdBy:

By locatorOfElementThatIsPresent = new WebDriverWait(webDriver, timeoutInSeconds).<By>until(driver -> {
    // findElements does not throw when element not found, so I skip try-catch
    if (driver.findElements(firstBy).size() > 0) return firstBy;
    if (driver.findElements(secondBy).size() > 0) return secondBy;
    if (driver.findElemetns(thirdBy).size() > 0) return thirdBy;
    return null; // neither found, so the method will be retried until timeout
});