【问题标题】:How to wait in selenium webdriver until the text of 5 characters length is entered如何在 selenium webdriver 中等待直到输入 5 个字符长度的文本
【发布时间】:2017-06-18 20:06:49
【问题描述】:

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

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

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

有什么办法可以等到文本框中输入5个字符(我的验证码总是5个字符的长度固定。)

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

【问题讨论】:

    标签: selenium selenium-webdriver webdriver


    【解决方案1】:

    首先,您不应该尝试使用 selenium 解决 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】:

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

    • 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;
              }
          }
      

      用法:

      WebElement e = driver.findElementByClassName("loginCaptcha");
      waitUntilElemValueLengthEquals(e,5);
      

      旁注:

      对于实际的实现,最好能创建一个实现 WebDriver 接口的类。该类将包含所有 WebDriver 接口方法和所有自定义方法(如上面的方法)。

    • 【讨论】:

        【解决方案3】:

        您应该使用一些预期的条件,例如,如果提交按钮呈灰色显示,直到您键入 5 个字符,或者将第五个验证码字符保存在变量中,然后等到第五个字符被键入,您应该使用一些预期的条件输入元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-28
          • 2014-01-03
          • 2013-10-08
          • 1970-01-01
          • 2018-01-13
          • 2013-12-31
          • 1970-01-01
          相关资源
          最近更新 更多