4 回答
TA贡献1785条经验 获得超8个赞
您可以使用 Fluent wait 来执行此操作。这将检查按钮是否每5秒可单击30秒。您可以根据需要调整时间。尝试此代码并提供反馈,无论它是否有效。
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, TimeUnit.SECONDS)
.pollingEvery(5, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
public WebElement apply(WebDriver driver ) {
return driver.findElement(By.xpath("//button[@id='btn_ok']"));
}
});
clickseleniumlink.click();
TA贡献1725条经验 获得超7个赞
试试这个方法。看看是否有帮助。
int size=driver.findElements(By.xpath("//button[@id='btn_ok']")).size();
if (size>0)
{
driver.findElement(By.xpath("//button[@id='btn_ok']")).click();
}
else
{
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
int size1=driver.findElements(By.xpath("//button[@id='btn_ok']")).size();
if (size1>0)
{
driver.findElement(By.xpath("//button[@id='btn_ok']")).click();
}
}
TA贡献1799条经验 获得超8个赞
您可以使用显式等待来等待按钮可单击。它将每500毫秒测试一次按钮,最长为指定时间,直到它可点击
WebDriverWait wait = new WebDriverWait(driver, 5); // maximum wait time is 5 here, can be set to longer time
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("btn_ok")));
button.click();
作为旁注,设置驱动程序将搜索元素的最长时间,它不会延迟脚本。implicitlyWait
TA贡献1780条经验 获得超1个赞
我更喜欢这个,因为它可以采取任何布尔条件来“等到”。
public static void WaitUntil(this IWebDriver driver, Func<bool> Condition, float timeout = 10f)
{
float timer = timeout;
while (!Condition.Invoke() && timer > 0f) {
System.Threading.Thread.Sleep(500);
timer -= 0.5f;
}
System.Threading.Thread.Sleep(500);
}
driver.WaitUntil(() => driver.FindElements(By.XPath("some xpath...").Length == 0);
//Here is the particular benefit over normal Selenium waits. Being able to wait for things that have utterly nothing to do with Selenium, but are still sometimes valid things to wait for.
driver.WaitUntil(() => "Something exists in the database");
我发现隐含的等待给我带来的麻烦比它的价值更大。我发现显式硒等待可能会变得有点冗长,并且它并没有在我的框架中涵盖我需要的所有内容,所以我已经进行了大量的扩展。这是其中之一。请注意,我在上面的示例中使用FindElements,因为我不希望在未找到任何内容时引发异常。这应该适合您。
注意:这是C#,但是对于任何语言(尤其是Java)修改它应该不难。如果您的语言不允许这样的扩展,只需在类中直接调用该方法即可。您需要将其放在静态类中才能正常工作。在逻辑中像这样扩展现有类时要小心,因为当其他人试图确定定义方法的位置时,它可能会混淆。
添加回答
举报