硒-等待元素不可见
本文关键字:元素 等待 | 更新日期: 2023-09-27 17:53:08
在下面的代码中,我尝试等待元素可见:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementIsVisible(By.Id("processing")));
是否可以告诉驾驶员等待,直到该元素不可见?
是的,使用方法invisibilityOfElementLocated
是可能的
wait.until(ExpectedConditions.invisibilityOfElementLocated(locator));
以下内容应等待,直到元素不再显示,即不可见(或10秒后超时(
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
如果找不到id为processing
的元素,它将引发异常。
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("processing")));
其想法是等待元素不可见。第一行设置元素必须消失的等待时间;现在是10秒。第二行使用硒来检查是否满足条件"元素不可见"。元素是根据其id找到的,就像在主题情况下一样,即id="processing"
。如果元素在请求的时间段内没有消失,则会引发Timeout异常,测试将失败。
截至2020年,ExpectedConditions在.NET.中已弃用
由于某种原因,我无法使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);
使用不可见性方法,下面是一个用法示例。
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);
}
}
您可以使用driver.FindElements
访问不存在的项目。
wait.Until(d => d.FindElements(By.Id("processing")).Count == 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;
}
是的,您可以创建自己的ExpectedCondition,只需将可见恢复为不可见。
以下是如何在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))
我知道这是旧的,但由于我正在寻找解决方案,我想我应该添加我的想法。
如果设置IgnoreExceptionTypes属性,上面给出的答案应该有效:
var wait = new WebDriverWait(Driver.Instance, TimeSpan.FromSeconds(10));
wait.IgnoreExceptionTypes = new[] { typeof(NoSuchElementException) }
wait Until(driver => !driver.FindElement(By.Id("processing")).Displayed);
在下面的代码中,用于停止驱动程序几秒钟
System.Threading.Thread.Sleep(20000(;