DefaultWait中的ExpectedConditions OR AND AND <t>

时间:2016-05-10 01:56:07

标签: selenium-webdriver

在使用C#,Selenium webdriver时,我导航到一个页面,该页面可能会重定向到登录屏幕或最终重定向或不重定向到实际的应用程序页面,具体取决于我是否有缓存凭据。 (点天蓝色活跃dir auth的情况)。

我所追求的是查找我的应用页面的已知元素是否出现,或者出现带有元素ID“use_another_account_link”的azure auth的登录屏幕。所以我想要OR的条件,而不必等待每个N秒。

2 个答案:

答案 0 :(得分:2)

您可以使用一个CSS选择器,其中两个项目由,分隔,以实现OR:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var element = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("#id1, #id2")));
if (element.GetAttribute("id") == "id1") {
    // handle element with id="id1"
} else {
    // handle element with id="id2"
}

或者是一个由|分隔的两次尝试的XPath:

var element = wait.Until(ExpectedConditions.ElementExists(By.XPath("id('id1') | id('id2')")));
if (element.GetAttribute("id") == "id1") {
    // handle element with id="id1"
} else {
    // handle element with id="id2"
}

答案 1 :(得分:0)

在这种情况下,您必须提供自己的Func<IWebElement, IWebElement>IWait<IWebElement>.Until()。你可以写一些具体的东西:

(Func<IWebElement, IWebElement>)
  (return ExpectedConditions.ElementExists(By.Id("use_another_account_link"))
  || ExpectedConditions.ElementExists(By.Id("your_login_field_id")))

或类似这样的通用:

public Func<IWebElement, IWebElement> Or(Func<IWebElement, IWebElement> either,
                                         Func<IWebElement, IWebElement> or) {
  return (Func<IWebElement, IWebElement>) either || or;
}