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。
答案 0 :(得分:0)
在输入一个预格式化的电话号码字段时,我在自动化一个测试用例时遇到了类似的问题。为了确保脚本能够在文本框中输入文本,我做了以下操作:
您的实现可以是这样的:
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 +输入都是多余的