如何等待首先使用 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# 有等效代码。
假设我正在等待 firstBy
、secondBy
或 thirdBy
:
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
});
我对 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# 有等效代码。
假设我正在等待 firstBy
、secondBy
或 thirdBy
:
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
});