我对Selenium WebDriver非常新鲜,我正在学习Selenium WebDriver,了解如何使用jQuery选择器来处理元素而不是XPath表达式,ID等…
可以帮助我提供链接,在那里我可以找到关于如何在Selenium WebDriver中使用jQuery的基本信息?
解决方法
你没有
JQuery选择器提供了大多数CSS 2和CSS 3选择器所做的工作,还有更多的东西,但你可能没有它可以生活.如果你知道JQuery选择器,你已经知道了CSS选择器.
使用可以使用的CSS选择器,并使用XPath表达式(它们更强).我怀疑你会发现很多真正的用法,其中两个是不够的(然后,通常的方法是得到你可以和迭代的集合,手动过滤结果).
也就是说,您可以强制WebDriver接受JQuery选择器:
如果您只想支持一个或两个浏览器,最简单的方法可能是写入一个简单的插件到该浏览器,如果它不存在,将注入JQuery到每个页面.然后,您将强制此插件由您使用的浏览器使用.
如果你想支持所有的浏览器,那么这个解决方案很快就成了一个负担,你可以做的最好的就是编写一个WebDriver的装饰器,它将尝试在任何findElements()和/或executeScript()调用之前将JQuery注入到页面中如果它还没有出现
请参阅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()");
您可以轻松地将这些行包装到您的装饰WebDriver的新的By对象或新的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 + ")\""; } }