sendKeys()不能通过Selenium和Java使用WebDriverWait插入完整值

时间:2019-04-04 14:50:14

标签: java selenium selenium-webdriver webdriver webdriverwait

sendKeys()未将完整字符串插入文本字段。我正在尝试插入电子邮件ID。

String name = "New Apollo33";
fluent_wait.until(ExpectedConditions.presenceOfElementLocated(By.id("businessname"))).sendKeys(name);

String email = "apollo33@mailinator.com";
fluent_wait.until(ExpectedConditions.presenceOfElementLocated(By.id("businessemail"))).sendKeys(email);

它是在插入名称,但没有完全插入电子邮件ID。

4 个答案:

答案 0 :(得分:0)

在输入一个预格式化的电话号码字段时,我在自动化一个测试用例时遇到了类似的问题。为了确保脚本能够在文本框中输入文本,我做了以下操作:

  • 手动检查文本框是否接受脚本尝试输入的文本长度。两次检查从来没有伤害:)。
  • 使用sendKeys输入值,然后从DOM中获取元素的值。
  • 虽然DOM中的文本框元素的值不等于您要输入的文本,然后重试。
  • 确保将退出条件添加到while循环中,以便您可以退出测试。

您的实现可以是这样的:

Wait<WebDriver> fluent_wait = new FluentWait<WebDriver>(driver)
                           .withTimeout(60, SECONDS)
                           .pollingEvery(2, SECONDS) 
                           .ignoring(NoSuchElementException.class);

WebElement emailElement= fluent_wait.until(new Function<WebDriver, WebElement>() {

     public WebElement apply(WebDriver driver) {
     return driver.findElement(By.id("businessemail"));
}
});
String emailText = "apollo33@mailinator.com";
long startTime = System.currentTimeMillis(); // This is to run the while loop for a specified amount of time and use it as an exit condition for the while loop.

//the below condition assumes that the text box sets some kind of attribute in the DOM element once the user enters the value in the text box.
while(!emailElement.getAttribute("value").equals(emailText)&&System.currentTimeMillis() - startTime) < 2000){
     emailElement.clear();
     emailElement.sendKeys(emailText);
}
//if the above doesn't work, add the below as a fall back:
if(!emailElement.getAttribute("value").equals(emailText)){
    emailElement.clear();
    for(char ch: emailText.toCharArray()){
        emailElement.sendKeys(String.valueOf(ch));
        try{
           Thread.sleep(15); //making the thread sleep for 15 milliseconds, taking a performance hit to make the sendKeys work.
        }catch(InterruptedException e){
        }
    }
}

仅当while循环无法在2秒钟内设置文本框中的文本时,才会执行Thread.sleep的回退条件。如果2秒/ 2000毫秒不足,则可以增加时间。在每次字符迭代之间,thread.sleep的命中率都微不足道,为15 ms。我们将其纳入我们的框架中,以涵盖采用不同前端技术开发的各种文本框。作为组织,这对我们来说很好,所以希望对您也一样。

上面的关键是不要被selenium提供的预定义实用程序所困扰,而是要使用Java提供的DOM值和选项。希望您能够尽快找到解决问题的方法。 祝你好运!

答案 1 :(得分:0)

作为拇指规则,而尝试发送字符序列而不是调用presenceOfElementLocated()时,请始终调用 elementToBeClickable() 您可以使用以下解决方案:

fluent_wait.until(ExpectedConditions.elementToBeClickable(By.id("businessname"))).sendKeys("New Apollo33");
fluent_wait.until(ExpectedConditions.elementToBeClickable(By.id("businessemail"))).sendKeys("apollo33@mailinator.com");

答案 2 :(得分:0)

我遇到了同样的问题。 sendKeys-Keys.chord 未插入完整值(速度太快以至于浏览器甚至“有时”都没有时间编写它)

之前:(100% 不起作用)

action.sendKeys(Keys.chord("string")).perform();

写“字符串”时速度太快了..有时(比如从 1/5 到 1/10 次)它在我发送到的网站上看起来不完整。而且非常令人沮丧..

我尝试应用的解决方案对我有用了几天,但最终还是发生了同样的事情(1/20 但它失败了)我尝试的解决方案只是添加了一个 sendKeys-Keys.chord 后 1.5seg 的“线程睡眠”(可能网站需要更多时间编写):

之后:(不能 100% 有效 - 我也尝试过这种可能的解决方案,但它失败的次数减少了,但仍然失败了 1/20)

action.sendKeys(Keys.chord("string")).perform();
Thread.sleep(1500);

最终解决方案:(100% 有效)

添加一个 do-while 来验证/检查 sendKeys-Keys.chord 是否与浏览器(WebDriver)上实际写入的内容匹配,如果不匹配,它将再次写入(您现在可以减少Thread.sleep 的延迟)

WebDriverWait wait = new WebDriverWait(driver,40);
Actions action = new Actions(driver);

  String TextSentenceORWordToIntroduce = "Dinosaur";
  wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_to_element"))).click();
  Thread.sleep(200);
  action.sendKeys(Keys.chord(TextSentenceORWordToIntroduce)).perform();
  Thread.sleep(500);
  String comprovation = driver.findElement(By.xpath("xpath_to_element")).getAttribute("value"); // or rarely ")).getText();"

if (!comprovation.contentEquals(TextSentenceORWordToIntroduce)) { // if not then ALL WORKS FINE ;) and won't enter the Do-while
    driver.findElement(By.xpath("xpath_to_element")).click();
    do {
        Thread.sleep(200);
        action.sendKeys(Keys.HOME).perform();
        Thread.sleep(200);
        action.keyDown(Keys.SHIFT).perform();
        Thread.sleep(200);
        action.sendKeys(Keys.END).perform();
        Thread.sleep(200);
        action.keyUp(Keys.SHIFT).perform();
        Thread.sleep(200);
        action.sendKeys(Keys.chord(TextSentenceORWordToIntroduce)).perform();
        Thread.sleep(500);
        comprovation = driver.findElement(By.xpath("xpath_to_element")).getAttribute("value"); // or rarely ")).getText();"
    } while (!comprovation.contentEquals(TextSentenceORWordToIntroduce));
}

希望这个解决方案可以帮助有同样问题的人^^

干杯!

答案 3 :(得分:-1)

我经常发现sendKeys()移动太快或输入的字符串不完整。 您需要以很小的延迟将其包装在while循环中:

while(element.text != input) {
    element.sendKeys(Keys.chord(Keys.CONTROL, "a"), input); //or whatever
    Thread.sleep(100) //100ms not 100sec
}

我知道thread.sleep被大量皱眉了,但是waitFor()会花同样的时间

element.clear()

也可以,但是使用clear()或Ctrl + a +输入都是多余的