如何使用Selenium使用HtmlUnitDriver单击Primefaces Datatable Table Row?

时间:2015-02-16 07:12:57

标签: java javascript ajax selenium primefaces

以下是示例代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class PrimeFaces {

    public static void main(String[] args) throws Exception {
        HtmlUnitDriver htmlUnitDriver = new HtmlUnitDriver(true);
        WebDriverWait wait = new WebDriverWait(htmlUnitDriver,10);
        htmlUnitDriver.get("http://primefaces-rocks.appspot.com/ui/datatableComplex.jsf");
        htmlUnitDriver.findElementById("j_idt44:j_idt45_row_0").click();
        WebElement until = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("ui-dialog-title-j_idt44:j_idt59")));
    }

}

此处,id: j_idt44:j_idt45_row_0 适用于此页面中的第一行:http://primefaces-rocks.appspot.com/ui/datatableComplex.jsf

当您点击此行时,您会看到一个弹出的窗口,其中包含一个ID为 j_idt44:j_idt59

的元素

但是使用HtmlUnitDriver这个元素是不可见的,因为我认为HtmlUnitDriver没有点击该行,或者没有触发事件监听器。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

似乎是一个计时问题。我使用了以下代码:

driver = new HtmlUnitDriver();
driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS);
driver.get("http://primefaces-rocks.appspot.com/ui/datatableComplex.jsf");

driver.findElement(By.id("j_idt44:j_idt45_row_0")).click();
assert driver.findElement(By.id("j_idt44:j_idt59")).isDisplayed();

对我来说非常好。

请注意,如果超时10秒,则每次都会失败。

答案 1 :(得分:1)

您的ID包含一个特殊字符::

如果你想访问你的div,你必须逃避它: htmlUnitDriver.findElementByCssSelector("#j_idt44\\:j_idt45_row_0").click();

希望有所帮助。

答案 2 :(得分:-1)

我认为你应该采用类似的方法点击按钮并等待执行,但首先要确保你找到正确的元素。

    response_object = htmlUnitDriver.findElementById("j_idt44:j_idt45_row_0").click();
    //test your condition here, and retries until you get the results
    synchronized (respnse_object) {
    page.wait(2000); //wait
    }