Java 如何使.click()仅在.sendkeys(“密码”)之后?

Java 如何使.click()仅在.sendkeys(“密码”)之后?,java,selenium,Java,Selenium,我有这样的代码,我填写了2个字段,然后点击登录按钮: driver.findElement(By.xpath(numberInputXPath)).sendKeys(number); driver.findElement(By.xpath(passwordInputXPath)).sendKeys(password); driver.findElement(By.xpath(loginButtonXPath)).click(); 我的问题是,有时按下登录按钮时,字段填写不完整。在我看来,关于不

我有这样的代码,我填写了2个字段,然后点击登录按钮:

driver.findElement(By.xpath(numberInputXPath)).sendKeys(number);
driver.findElement(By.xpath(passwordInputXPath)).sendKeys(password);
driver.findElement(By.xpath(loginButtonXPath)).click();
我的问题是,有时按下登录按钮时,字段填写不完整。在我看来,关于不完全性的模式似乎是随机的。我在字符串
number
处有11个数字,我的
密码
长度为8个字母数字字符。有时字段完全填充,有时第一个字段一半不完整,
password
完全填充,反之亦然。有时它们会正常完成,我的登录也会成功完成。除了线程睡眠和解决方案,我怎么能只等待我的字段被填满呢

编辑


我没有时间尝试答案的解决方案,我会尽快,但我正在尝试自动登录。我一直等到Selenium识别出右键
登录
按钮,单击它,然后按照上面所写的填写字段。我注意到每次执行
sendKeys
时,页面的Chrome选项卡上仍然有加载图标。总是。因此,我假设在编写本文时总会加载一些JS。

我目前无法访问所有代码。如果您认为这可能是一个ajax问题,我确实有代码等待ajax完成。如果我的可用代码(如下)没有帮助,我会发布。它检查文档状态是否就绪,通常在页面加载完成时设置,但不考虑ajax元素之类的内容。不过值得一试,所以请告诉我

/**
 * Wait for the web page to finish loading
 * @author Bill Hileman
 */
public void waitForPageToLoad() {

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(new ExpectedCondition<Boolean>() {

        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
        }
    });
}
/**
*等待网页完成加载
*@作者比尔·希勒曼
*/
public void waitForPageToLoad(){
WebDriverWait wait=新的WebDriverWait(驱动程序,10);
等待.直到(新的ExpectedCondition(){
公共布尔应用(WebDriver wdriver){
return((JavascriptExecutor)driver.executeScript(“return document.readyState”).equals(“complete”);
}
});
}

我目前无法访问所有代码。如果您认为这可能是一个ajax问题,我确实有代码等待ajax完成。如果我的可用代码(如下)没有帮助,我会发布。它检查文档状态是否就绪,通常在页面加载完成时设置,但不考虑ajax元素之类的内容。不过值得一试,所以请告诉我

/**
 * Wait for the web page to finish loading
 * @author Bill Hileman
 */
public void waitForPageToLoad() {

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(new ExpectedCondition<Boolean>() {

        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
        }
    });
}
/**
*等待网页完成加载
*@作者比尔·希勒曼
*/
public void waitForPageToLoad(){
WebDriverWait wait=新的WebDriverWait(驱动程序,10);
等待.直到(新的ExpectedCondition(){
公共布尔应用(WebDriver wdriver){
return((JavascriptExecutor)driver.executeScript(“return document.readyState”).equals(“complete”);
}
});
}

我不知道您正在测试的站点的技术堆栈,但是。可能存在Ajax或角度问题。我遇到了同样的问题,当选择一个对象时,会有很多ajax CAL。因此,我们必须在每个Selenium命令之前实现一个服务员策略


你可以看看这篇文章:这些等待策略必须帮助你克服这些问题。

我不知道你正在测试的网站的技术堆栈,但是。可能存在Ajax或角度问题。我遇到了同样的问题,当选择一个对象时,会有很多ajax CAL。因此,我们必须在每个Selenium命令之前实现一个服务员策略


你可以看看这篇文章:这些等待策略必须帮助你克服这些问题。

让我猜猜。。。您的浏览器使用IE?不,我使用
ChromeDriver
作为浏览器。我在想,当Selenium在其上插入数据时,某些JS可能会更改XPathit@GabrielRado,请检查两个文本字段中的数字和密码,手动填写时将进行验证检查,如果是,我猜开发人员添加的验证Javascript函数打破了selenium正常的sendkeys。@Gabrielado您观察到的行为可能有很多可能性。用相关的HTML更新问题让我猜一下。。。您的浏览器使用IE?不,我使用
ChromeDriver
作为浏览器。我在想,当Selenium在其上插入数据时,某些JS可能会更改XPathit@GabrielRado,请检查两个文本字段中的数字和密码,手动填写时将进行验证检查,如果是,我猜开发人员添加的验证Javascript函数打破了selenium正常的sendkeys。@Gabrielado您观察到的行为可能有很多可能性。用相关的HTML更新问题,稍加修改,这篇文章解决了我的问题,谢谢稍加修改,这篇文章解决了我的问题,谢谢