我正在尝试自动化涉及CAPTCHA的应用程序。 我尝试使用WebDriverWait和下面的代码:
WebDriverWait mywait = new WebDriverWait(driver,20);
mywait.until(ExpectedConditions.attributeToBeNotEmpty(driver.findElementByClassName("loginCaptcha"),"value"));
现在问题是,只要我在文本中输入验证码的第一个字符,上述条件就变为真,下一个语句将被执行,导致验证码错误无效。
有没有办法等到文本框中输入5个字符(我的验证码总是固定5个字符。)
PS:我不想使用静态等待。
答案 0 :(得分:1)
您可以使用以下方法执行此操作:
private Wait<WebDriver> wait = new FluentWait<>(yourWebDriverInstance).withTimeout(10, TimeUnit.SECONDS).pollingEvery(500, TimeUnit.MILLISECONDS).ignoring(NoSuchElementException.class);
private Function<WebDriver, Boolean> expectedConditions(boolean condition) {
return driver -> condition;
}
public void waitUntilElemValueLengthEquals(WebElement element, int length) {
try {
wait.until(expectedConditions(element.getAttribute("value").length == length));
} catch (Exception e) {
LOGGER.error(e.getMessage(), e);
throw e;
}
}
<强> USAGE:强>
WebElement e = driver.findElementByClassName("loginCaptcha");
waitUntilElemValueLengthEquals(e,5);
侧面注意:
对于实际的实现,如果您可以创建一个实现WebDriver接口的类,那将是一件好事。该类将包含所有WebDriver接口方法和所有自定义方法(如上所述)。
答案 1 :(得分:1)
首先,你不应该尝试用硒来解决CAPTCHA。 CAPTCHA的全部目的是防止UI自动化。如果你想克服CAPTCHA,你应该使用你的SUT的内部API。
关于等待特定文本长度,它应该类似于:
//First init WebDriverWait to 20 sec
WebDriverWait mywait = new WebDriverWait(driver, 20);
//Locator to your DOM element
By byClass = By.class("loginCaptcha");
//Wait until text box has value greater or equal 5 character
mywait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return (d.findElement(byClass).getAttribute ("value").length() >= 5)
}
});
答案 2 :(得分:0)
你应该使用一些预期的条件,比如等到提交按钮可点击,如果它变灰,直到你输入5个字符或保存在变量中的第五个验证码字符,然后等到第五个字符输入到输入元素。