Java 如何使用Selenium 3定位ZK DOM节点?

Java 如何使用Selenium 3定位ZK DOM节点?,java,selenium-webdriver,zk,Java,Selenium Webdriver,Zk,使用ZK时,我有开发id(id=“foo”)。如何使用Selenium 3为其获取DOM节点?这涉及几个步骤。首先,需要使用客户端JavaScript定位DOM节点。ZK为此提供了函数window.jq()。此函数允许您访问jQuery实例(请参阅) 要区分DOM和ZK ID,请分别使用#和$ 最后的JavaScript应该是这样的: jq('$foo') 要运行此JavaScript,请使用driver.executeScript()。您可能还希望使用上下文(开发ID通常仅在ZK父元素中是唯

使用ZK时,我有开发id(
id=“foo”
)。如何使用Selenium 3为其获取DOM节点?

这涉及几个步骤。首先,需要使用客户端JavaScript定位DOM节点。ZK为此提供了函数
window.jq()
。此函数允许您访问jQuery实例(请参阅)

要区分DOM和ZK ID,请分别使用
#
$

最后的JavaScript应该是这样的:

jq('$foo')
要运行此JavaScript,请使用
driver.executeScript()
。您可能还希望使用上下文(开发ID通常仅在ZK父元素中是唯一的)

结果是一个jQuery集,例如ChromeDriver无法处理(您将得到
javascript错误:循环引用
errors)。因此,需要对结果调用
toArray()
,以将jQuery对象转换为具有普通DOM节点的数组。ChromeDriver知道如何将这些转换为Java。剩下的就是从JavaScript返回这个数组。然后,您将在Java端获得一个
列表

我已为此创建了一个
By
定位器:

public class ByZKId extends By {

    private String id;
    private WebElement context;

    public ByZKId(String id) {
        this.id = "$" + id;
    }

    public ByZKId(String id, WebElement context) {
        this.id = "$" + id;
        this.context = context;
    }

    @Override
    public List<WebElement> findElements(SearchContext context) {
        if (context == null) {
            return executeJavaScript("return jq(arguments[0]).toArray();", id);
        }

        return executeJavaScript("return jq(arguments[0], arguments[1]).toArray();", id, this.context);
    }

    @Override
    public String toString() {
        return "ByZKId: [" + id + "]";
    }
}
公共类ByZKId扩展为{
私有字符串id;
私有web元素上下文;
公共ByZKId(字符串id){
this.id=“$”+id;
}
公共ByZKId(字符串id,WebElement上下文){
this.id=“$”+id;
this.context=上下文;
}
@凌驾
公共列表findElements(SearchContext上下文){
if(上下文==null){
返回executeJavaScript(“返回jq(参数[0]).toArray();”,id);
}
return executeJavaScript(“return jq(参数[0],参数[1]).toArray();”,id,this.context);
}
@凌驾
公共字符串toString(){
返回“ByZKId:[“+id+”]”;
}
}