你不应该。 JQuery 选择器提供了 CSS 2 和 CSS 3 选择器的大部分功能,以及更多功能,但您可能没有它也可以生活。如果您了解 JQuery 选择器,那么您已经了解 CSS 选择器。
在可能的情况下使用 CSS 选择器,在不够的情况下使用 XPath 表达式(它们更强大)。我怀疑你会发现这两个还不够的许多实际用法(然后,通常的方法是获取你能做的并迭代集合,手动过滤结果)。
也就是说,您也可以强制 WebDriver 接受 JQuery 选择器:
如果您只想支持一个或两个浏览器,最简单的方法可能是为该浏览器编写一个简单的插件,如果 JQuery 不存在,它将向每个页面注入 JQuery。然后,您将强制您正在使用的浏览器使用此插件。
如果您想支持所有浏览器,该解决方案很快就会成为一种负担,您可以做的最好的事情是为 WebDriver 编写一个装饰器,它会尝试在任何 findElements() 和/或 @ 之前将 JQuery 注入页面987654324@ 电话,如果它不存在的话。
请参阅this question 了解有关注入 JQuery 的想法。
注入后,您可以再次使用它,但只能通过 JavaScript:
// earlier
if (driver instanceof JavascriptExecutor) {
js = (JavascriptExecutor)driver;
} else {
throw new IllegalStateException("This driver cannot run JavaScript.");
}
WebElement element = (WebElement)js.executeScript("$('div.account').get(0)");
// or
List<WebElement> elements = (List<WebElement>)js.executeScript("$('div.account').get()");
如果您愿意,您可以轻松地将这些行包装到一个新的 By 对象中,或者为您的装饰 WebDriver 提供一个新的 findElement(String jQuerySelector) 方法,但这取决于您的方便和懒惰,我们让它工作...
我认为最好的方法是创建一个名为ByJQuery 的新By 实现。请参阅 this answer 了解如何创建 ByJavaScript - 重用它只是一小步,将 JQuery 注入页面并运行实际查询。
class ByJQuery extends By implements Serializable {
private final String query;
public ByJQuery(String query) {
checkNotNull(query, "Cannot find elements with a null JQuery expression.");
this.query = query;
}
@Override
public List<WebElement> findElements(SearchContext context) {
WebDriver driver = getWebDriverFromSearchContext(context);
if (!isJQueryInThisPage(driver)) {
injectJQuery(driver);
}
return new ByJavaScript("return $(" + query + ")").findElements(context);
}
private static WebDriver getWebDriverFromSearchContext(SearchContext context) {
if (context instanceof WebDriver) {
return (WebDriver)context;
}
if (context instanceof WrapsDriver) {
return ((WrapsDriver)context).getWrappedDriver();
}
throw new IllegalStateException("Can't access a WebDriver instance from the current search context.");
}
private static boolean isJQueryInThisPage(WebDriver driver) {
// TODO Some JavaScript test for a JQuery object.
}
private static void injectJQuery(WebDriver driver) {
// TODO Load JQuery from a file, inject it into the page via JS.
}
@Override
public String toString() {
return "By.jQuery: \"$(" + query + ")\"";
}
}