如何在selenium webdriver中等待,直到输入5个字符长度的文本

时间:2017-06-18 20:06:50

标签: selenium selenium-webdriver webdriver

我正在尝试自动化涉及CAPTCHA的应用程序。 我尝试使用WebDriverWait和下面的代码:

WebDriverWait mywait = new WebDriverWait(driver,20);
mywait.until(ExpectedConditions.attributeToBeNotEmpty(driver.findElementByClassName("loginCaptcha"),"value"));

现在问题是,只要我在文本中输入验证码的第一个字符,上述条件就变为真,下一个语句将被执行,导致验证码错误无效。

有没有办法等到文本框中输入5个字符(我的验证码总是固定5个字符。)

PS:我不想使用静态等待。

3 个答案:

答案 0 :(得分:1)

您可以使用以下方法执行此操作:

  • FluentWait

    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个字符或保存在变量中的第五个验证码字符,然后等到第五个字符输入到输入元素。