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.一旦页面完全加载,它将开始执行您的代码.
而不是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
.
除了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)
归档时间: |
|
查看次数: |
21322 次 |
最近记录: |