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

时间:2016-05-24 14:08:11

标签: java selenium

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

<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>

在阅读了这篇文章post on how to force selenium to locate the hidden field之后,我认为我有解决方案,但它开始让我发疯。

我有以下代码:

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();
    }
}

}

但是当我多次运行它时,结果会有所不同,有时它会起作用,而且大多数时候我都会这样做:

  

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

进行交互

我不明白这个的含义,我敢肯定,为什么这个随机有效?我做错了什么?

编辑1:我编辑了代码,我很确定。当我垃圾邮件运行此代码时,它可以运行1次5次。我还是不知道为什么。我正在寻找一种方法来检查页面上可见的所有元素。

1 个答案:

答案 0 :(得分:0)

看起来你的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();