在下面的代码中,我尝试等到元素可见:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));
是否可以告诉司机等到该元素不可见?
答案 0 :(得分:30)
是的,可以使用方法invisibilityOfElementLocated
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
答案 1 :(得分:10)
以下内容应等到元素不再显示,即不可见(或10秒后超时)
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
如果找不到标识为processing
的元素,则会抛出异常。
答案 2 :(得分:5)
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));
想法是等到元素不可见。第一行设置元素必须消失的等待时间;这里10秒钟。第二行使用selenium检查条件" invisibilityofElementLocated"满足了。元素通过其id在主题案例中找到,即id="processing"
。如果元素在请求的时间段内没有消失,则会引发超时异常并且测试将失败。
答案 3 :(得分:2)
从2020年开始,.NET中不赞成使用ExpectedConditions。
由于某种原因,我无法使IgnoreExceptionTypes正常工作。
唯一适用于我的解决方案是Anoop提出的解决方案。我喜欢他的解决方案的一件事是,一旦元素变得不可见,它就会立即返回。
我将他的解决方案概括如下:
//returns as soon as element is not visible, or throws WebDriverTimeoutException
protected void WaitUntilElementNotVisible(By searchElementBy, int timeoutInSeconds)
{
new WebDriverWait(_driver, TimeSpan.FromSeconds(timeoutInSeconds))
.Until(drv => !IsElementVisible(searchElementBy));
}
private bool IsElementVisible(By searchElementBy)
{
try
{
return _driver.FindElement(searchElementBy).Displayed;
}
catch (NoSuchElementException)
{
return false;
}
}
用法:
WaitUntilElementNotVisible(By.Id("processing"), 10);
答案 4 :(得分:1)
使用隐身方法,这是一个示例用法。
final public static boolean waitForElToBeRemove(WebDriver driver, final By by) {
try {
driver.manage().timeouts()
.implicitlyWait(0, TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(UITestBase.driver,
DEFAULT_TIMEOUT);
boolean present = wait
.ignoring(StaleElementReferenceException.class)
.ignoring(NoSuchElementException.class)
.until(ExpectedConditions.invisibilityOfElementLocated(by));
return present;
} catch (Exception e) {
return false;
} finally {
driver.manage().timeouts()
.implicitlyWait(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
}
}
答案 5 :(得分:0)
我知道这已经过时了,但是因为我正在寻找解决方案,我想我会添加自己的想法。
如果设置IgnoreExceptionTypes属性,则上面给出的答案应该有效:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
答案 6 :(得分:0)
public void WaitForElementNotVisible(string id, int seconds)
{
try
{
var wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(seconds));
wait.Until(driver1 => !visibility(id));
Console.WriteLine("Element is not visible..");
}
catch (WebDriverTimeoutException)
{
Assert.Fail("Element is still visible..");
}
}
bool visibility(string id)
{
bool flag;
try
{
flag = driver.FindElement(By.Id(locator)).Displayed;
}
catch (NoSuchElementException)
{
flag = false;
}
return flag;
}
答案 7 :(得分:0)
是的,您可以创建自己的预期条件,只需将其隐藏为不可见。
以下是如何在python中执行此操作:
from selenium.webdriver.support.expected_conditions import _element_if_visible
class invisibility_of(object):
def __init__(self, element):
self.element = element
def __call__(self, ignored):
return not _element_if_visible(self.element)
以及如何使用它:
wait = WebDriverWait(browser, 10)
wait.until(invisibility_of(elem))
答案 8 :(得分:0)
您可以使用driver.FindElements
来访问不存在的项目。
wait.Until(d => d.FindElements(By.Id("processing")).Count == 0);
答案 9 :(得分:-14)
在下面的代码中用于停止驱动程序几秒钟
System.Threading.Thread.Sleep(20000);