Java 如何使用Selenium 3定位ZK DOM节点?
使用ZK时,我有开发id(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父元素中是唯
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+”]”;
}
}