Selenium Webdriver等待元素点击?

hac*_*ket 10 c# selenium timeout webdriver

我一直在寻找解决方案,但无济于事.我有一个按钮,我点击,有时需要很长一段时间才能返回数据,并且驱动程序正在超时,只是杀了应用程序我猜.

我试图使用WebDriverWait类来完成此任务,但Click()方法不能用于我使用它的方式.

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 5, 0));

bool clicked = wait.Until<bool>((elem) =>
{
     elem.Click(); //Doesn't Work
     return true;
});
Run Code Online (Sandbox Code Playgroud)

ImplicitlyWait()方法仅用于等待加载元素,但这会在Click()上超时,因此它甚至无法查找元素.

SetScriptTimeout()方法只适用于执行javascript,我没有这样做.

有谁知道这样做的方法?

Adi*_*iti 12

试试这个 :

WebDriverWait wait = new WebDriverWait(driver , 1000) ;
wait.until(ExcepctedConditions.elementToBeClickable(ById("element"));
Run Code Online (Sandbox Code Playgroud)

元素可以是您重定向到的下一页上的任何元素的ID.一旦页面完全加载,它将开始执行您的代码.


pre*_*sto 5

而不是Click你可以尝试使用SendKeys.与之不同Click,SendKeys在恢复代码执行之前不会等待页面完成加载.所以你可以这样做:

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(0, 5, 0));

elem.SendKeys(Keys.Enter);    
wait.Until<bool>((_driver) =>
{         
     //Check here if results have loaded yet
     return true;
});
Run Code Online (Sandbox Code Playgroud)

作为旁注,我非常确定Until接受IWebBrowser一个输入,而不是一个元素,这就是为什么你不能点击elem.


hac*_*ket 5

除了prestomanifesto的解决方案,我可以提供一个不太理想的解决方案来解决这个问题.事实证明它抛出一个异常 - 没有响应等... - 所以我只是试着抓住它然后等待弹出窗口关闭,这似乎工作正常.

你可以在循环中替换你想要的任何东西,只要确保放入一个计数器,这样它就不会永远循环.

try
{
    element.Click();
}
catch
{
    cnt++;
    do
    {
      //wait for whatever
      cnt++;
      Thread.Sleep(1000);
      // Wait for 30 seconds for popup to close
    } while (!string.IsNullOrEmpty(browser.CurrentWindowHandle) && cnt < 30);
}
Run Code Online (Sandbox Code Playgroud)