如何使用 Selenium 通过 HtmlUnitDriver 单击 Primefaces 数据表表行?

问题描述 投票:0回答:3

这是示例代码:

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 没有单击该行,或者事件侦听器没有被触发。

如何解决这个问题?

java javascript ajax selenium primefaces
3个回答
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
投票

您的ID包含特殊字符:

:

如果你想访问你的div,你必须转义它:

htmlUnitDriver.findElementByCssSelector("#j_idt44\\:j_idt45_row_0").click();

希望有帮助。


-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
    }
© www.soinside.com 2019 - 2024. All rights reserved.