我对 Selenium WebDriver 非常陌生,我正在学习如何使用 jQuery 选择器来处理元素,而不是使用 XPath 表达式、ID 等...
您能否通过提供一个链接来帮助我,我可以在其中找到有关如何在 Selenium WebDriver 中使用 jQuery 的一些基本信息?
我对 Selenium WebDriver 非常陌生,我正在学习如何使用 jQuery 选择器来处理元素,而不是使用 XPath 表达式、ID 等...
您能否通过提供一个链接来帮助我,我可以在其中找到有关如何在 Selenium WebDriver 中使用 jQuery 的一些基本信息?
你不应该。JQuery 选择器提供了 CSS 2 和 CSS 3 选择器的大部分功能,以及更多功能,但您可能没有它也可以生活。如果您知道 JQuery 选择器,那么您已经知道 CSS 选择器。
在可能的地方使用 CSS 选择器,在不够的地方使用 XPath 表达式(它们更强大)。我怀疑你会发现这两个还不够的许多实际用法(然后,通常的方法是尽你所能并迭代集合,手动过滤结果)。
也就是说,您也可以强制 WebDriver 接受 JQuery 选择器:
如果您只想支持一个或两个浏览器,最简单的方法可能是为该浏览器编写一个简单的插件,如果 JQuery 不存在,它将向每个页面注入 JQuery。然后,您将强制您正在使用的浏览器使用此插件。
如果您想支持所有浏览器,该解决方案很快就会成为一种负担,您可以做的最好的事情是为 WebDriver 编写一个装饰器,如果 JQuery尚不存在,它将尝试在任何findElements()
和/或调用之前将 JQuery 注入页面executeScript()
.
请参阅此问题以了解有关注入 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
对象中,或者findElement(String jQuerySelector)
为您的装饰 WebDriver 提供一个新方法,但这取决于您的方便和懒惰,我们让它工作......
我认为最好的方法是创建一个By
名为ByJQuery
. 请参阅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 + ")\"";
}
}
iWebdriver jQuery 扩展,这将适用于所有浏览器。复制并粘贴到您的 webdriver 扩展。
public static IWebElement FindByTextJQuery(this IWebDriver driver, string Tagname, string Text)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'");
if (flag)
{
js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);");
}
driver.WaitForAjax();
js.ExecuteScript("$('" + Tagname + ":contains(" + Text + ")').css('background-color', '')");
IWebElement elements = (IWebElement)js.ExecuteScript(@"return $('"+Tagname+":contains("+Text+")')[0]");
return elements;
}
public static string getTextByJquery(this IWebDriver driver, string jquery)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
string elementsText = (string)js.ExecuteScript("return $('" + jquery + "').text()");
return elementsText;
}
public static int returnIndexByJquery(this IWebDriver driver, string jQuery)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'");
if (flag)
{
js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);");
}
driver.WaitForAjax();
// js.ExecuteScript(@"return $('" + Tagname + ":contains(" + Text + ")').css('background-color', 'blue')");
Int64 elementIndex = (Int64)js.ExecuteScript(@"return $('"+jQuery+"').index()[0]");
return Convert.ToInt32(elementIndex);
}
public static int returnCountByJquery(this IWebDriver driver, string jQuery)
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
bool flag = (bool)js.ExecuteScript("return typeof jQuery == 'undefined'");
if (flag)
{
js.ExecuteScript("var jq = document.createElement('script');jq.src = '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js';document.getElementsByTagName('head')[0].appendChild(jq);");
}
driver.WaitForAjax();
// js.ExecuteScript(@"return $('" + Tagname + ":contains(" + Text + ")').css('background-color', 'blue')");
Int64 elementCount = (Int64)js.ExecuteScript(@"return $('" + jQuery + "').size()");
return Convert.ToInt32(elementCount);
}
我使用find_element_by_css_selector()
它,它给了我我需要的一切。
根据这篇博文,selenium 使用与 jquery 相同的 css 引擎。
下面是使用单击操作来选择使用 jquery 选择器的元素的代码块
1) .overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable
Webdriver driver = new SafariDriver();
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("$('.overlay-selector-indicator.ui-draggable.selected-overlay.ui-resizable').click();", "");
您可以使用任何 jquery 选择器来代替 1。并且可以使用任何事件来代替 click()。