我们想为在非常复杂的网页上使用Selenium webDriver的复杂Java代码编写JUnit测试。
我们发现,保存网页始终会更改xpath,因此就可以了。模拟WebDriver,WebElements既困难又混乱。
最后,我们选择为逻辑使用的XPATHS生成HTML文件,然后让webDriver简单地加载测试HTML页面。
我们在下面编写了代码,并且在大多数时间 都有效。但是在进一步开发之前,我们要问是否有更简单/更好的方法,或者为此目的使用的库或实用程序。
public void generateHtml(String xPath) {
ArrayList<String> htmlDoc = new ArrayList<>();
htmlDoc.add("<!DOCTYPE html>");
Pattern patt = Pattern.compile("\\[(\\d+)]");
Matcher matcher;
String[] tokens = xPath.substring(1).split("/");
ArrayList<String> closeTags = new ArrayList<>();
for (final String token : tokens) {
final String tag = token.split("\\[")[0];
// collect closing tags
closeTags.add(mkCloseTag(tag));
// get the index if present
matcher = patt.matcher(token);
int idx = 0;
if (matcher.find()) {
idx = Integer.parseInt(matcher.group(1));
}
// if indexed, create enough empty tag pairs up to the indexed one
if (idx > 0) {
for (int i = 1; i < idx; ++i) {
htmlDoc.add(mkTag(tag) + idx);
htmlDoc.add(mkCloseTag(tag));
}
}
// append an extra tag pair if idx is 1
if (idx == 1) {
closeTags.add(mkTag(tag) + idx);
closeTags.add(mkCloseTag(tag));
}
htmlDoc.add(mkTag(tag));
}
// append all the close-tags
Collections.reverse(closeTags);
htmlDoc.addAll(closeTags);
for(String t : htmlDoc) {
System.out.println(t);
}
}
我们正在处理的xpath示例:
/html/body/div[6]/div[3]/div/div[2]/div/div[2]/div/div[2]/div/form/table/tbody/tr/td/table/tbody/tr[2]/td[2]/div/div[2]/div/table/tbody/tr/td/input