Java 硒和隐藏形式,非决定论执行

Java 硒和隐藏形式,非决定论执行,java,selenium,Java,Selenium,我想测试一个javaEE应用服务器,我想用Selenium测试它,当Selenium连接时,他必须通过一个登录页面,但是这个登录页面的形式是隐藏的,所以我尝试在一个表单中键入文本,该表单使用Selenium的hidden属性 <form hidden name="formLogin" method="POST" action="/app/"> <input type="hidden" name="home" value="true"> </form&

我想测试一个javaEE应用服务器,我想用Selenium测试它,当Selenium连接时,他必须通过一个登录页面,但是这个登录页面的形式是隐藏的,所以我尝试在一个表单中键入文本,该表单使用Selenium的hidden属性

<form hidden name="formLogin" method="POST" action="/app/">
        <input type="hidden" name="home" value="true">
</form>
<form hidden name="formLogout" method="POST" action="/app/">
        <input type="hidden" name="home" value="false">
</form>

读完这篇文章后,我以为我找到了解决办法,但它开始让我发疯

我有以下代码:

public class SeleniumTestKheops {
static WebDriver driver;
static Wait<WebDriver> wait;

public static void main(String[] args) throws InterruptedException {
    driver = new FirefoxDriver();
    wait= new WebDriverWait(driver, 30);
    final String url = "https://localhost:8444/app/";
    try {
    driver.navigate().to(url);

    JavascriptExecutor js = (JavascriptExecutor) driver;

    js.executeScript("document.getElementsByName('formLogin')[0].checked = true;");
    js.executeScript("document.getElementsByName('formLogout')[0].checked = true;");
    driver.findElement(By.xpath("//input")).clear();
   driver.findElement(By.xpath("//input")).sendKeys("root");
   driver.findElement(By.xpath("//div[2]/div/div/input")).clear();
   driver.findElement(By.xpath("//div[2]/div/div/input")).sendKeys("pass");

   driver.findElement(By.xpath("//a[contains(@href, '#')]")).click();
    } finally {
        //driver.close();
    }
}

}
公共类SeleniumTestKheops{
静态网络驱动程序;
静态等待;
公共静态void main(字符串[]args)引发InterruptedException{
驱动程序=新的FirefoxDriver();
等待=新的WebDriverWait(驱动程序,30);
最终字符串url=”https://localhost:8444/app/";
试一试{
driver.navigate()。指向(url);
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
js.executeScript(“document.getElementsByName('formLogin')[0]。checked=true;”;
js.executeScript(“document.getElementsByName('formLogout')[0]。checked=true;”;
driver.findElement(By.xpath(“//input”).clear();
driver.findElement(By.xpath(“//input”).sendKeys(“根”);
findElement(By.xpath(“//div[2]/div/div/input”)).clear();
findElement(By.xpath(“//div[2]/div/div/input”)).sendKeys(“pass”);
findElement(By.xpath(“//a[contains(@href,#')])))。单击();
}最后{
//driver.close();
}
}
}
但是,当我多次运行它时,结果是不同的,有时它是有效的,而且大多数时候我都:

线程“main”org.openqa.selenium.ElementNotVisibleException中的异常:元素当前不可见,因此可能无法与之交互

我不明白这是什么意思,我肯定,为什么这是随机工作?我做错了什么


编辑1:我编辑了代码,我确信。当我垃圾邮件运行这段代码时,它会工作1对5次。我还是不知道为什么。我正在寻找一种方法来检查页面上所有可见的webelement。

看起来您的xpath选择器太通用了

您可以等待某个元素在中可见

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//valid/xpath"))));
我不明白你想用你的方法做什么。您的java代码与提供的html不匹配。请提供一个更完整的html示例

使用当前的java代码,您可以等待以下所有元素:

// define reusable Bys
By usernameInput = By.xpath("//input");
By passwordInput = By.xpath("//div[2]/div/div/input");
By submitButton = By.xpath("//a[contains(@href, '#')]");

// wait for all elements to be visible
wait.until(ExpectedConditions.visibilityOfElementLocated(usernameInput));
wait.until(ExpectedConditions.visibilityOfElementLocated(passwordInput));
wait.until(ExpectedConditions.visibilityOfElementLocated(submitButton));
// clear username field and type username
driver.findElement(usernameInput).clear();
driver.findElement(usernameInput).sendKeys("root");
// clear password field and type password
driver.findElement(passwordInput).clear();
driver.findElement(passwordInput).sendKeys("pass");
// submit the form
driver.findElement(submitButton).click();

它找不到哪个元素?我不知道为什么,但我通过使用isEnabled方法测试3元素,使它可行。但你的方式似乎更干净了。谢谢。因此引发了异常,因为代码在WebElement可见之前继续执行?@BobReynolds添加几行代码以执行isEnabled检查可能会给页面几毫秒的时间来加载元素。是的,ElementNotVisibleException表示您尝试与之交互的元素在firefox实例中不可见。