我需要等待一个元素不可见 并为此找到了几个解决方案,但它们似乎都不适合我。
我认为问题是因为我正在使用PageObject Models。但我不完全确定。
public static void WaitForElementToBeInvisible(this Browser browser, IWebElement element, int seconds = 30)
{
var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element));
}
但它返回错误cannot convert from IWebElement to Selenium.By
提前致谢
答案 0 :(得分:1)
简短的回答,这是不可能的。 Selenium的开发人员已经确定没有有用的用例。
如果可以使用By
定位器,您可以使用:
public static void WaitUntilInvisible(this By locator)
{
try
{
if (Driver.FindElement(locator).Displayed)
{
wait.Until(ExpectedConditions.ElementIsVisible(locator));
}
}
答案 1 :(得分:1)
您的代码不正确。它调用InvisibilityOfElementLocated
,它不接收IWebElement作为参数。请参阅下面的示例。
public static bool WaitForElementToBeInvisible(this IWebElement element, int timeoutSecond = 10)
{
IWait<IWebElement> wait = new DefaultWait<IWebElement>(element);
wait.Timeout = TimeSpan.FromSeconds(timeoutSecond);
wait.PollingInterval = TimeSpan.FromMilliseconds(300);
try
{
wait.Until(!element.Displayed);
}
catch (WebDriverTimeoutException)
{
return false;
}
return true;
}
IWebElement div = driver.FindElement(By.Id("id"));
var result = div.WaitForElementToBeInvisible(5);
答案 2 :(得分:0)
感谢所有的答案,但是这样解决了。
public static void WaitUntilInvisible(this Browser browser, By element, int seconds = 30)
{
var wait = new WebDriverWait(browser.Driver, new TimeSpan(0, 0, seconds));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(element));
}
然后用作By Locator
By LoadingIcon = By.XPath(".//*[contains(@class, 'loading')]");
就像一个魅力:)
答案 3 :(得分:0)
do { Playback.Wait(100); } while (_driver.FindElements(By.Id("elementId")).Count() > 0);