Selenium WebDriver jQuery
我对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 表达式(它们更强大)时使用 XPath 表达式。我怀疑你会发现许多实际的用法在这两个是不够的(然后,通常的方法是获取你能得到的东西,并迭代集合,手动过滤结果)。
也就是说,您也可以强制WebDriver接受JQuery选择器:
如果您只想支持一个或两个浏览器,最简单的方法可能是为该浏览器编写一个简单的插件,如果JQuery尚不存在,它将它将JQuery注入到每个页面。然后,您将强制您正在使用的浏览器使用此插件。
如果你想支持所有的浏览器,这个解决方案很快就会成为一个负担,你能做的最好的事情就是为WebDriver编写一个装饰器,它会在任何和/或调用之前尝试将JQuery注入到页面中,如果它还没有出现的话。findElements()
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()");
如果你愿意,你可以轻松地将这些行包装成一个新对象,或者一个新的方法来装饰你的WebDriver,但这取决于你的方便和懒惰,我们让它工作...By
findElement(String jQuerySelector)
我认为,最好的方法是创建一个名为 .请参阅有关如何制作的答案 - 从那里重用它只是一小步,将JQuery注入页面并运行实际查询。By
ByJQuery
ByJavaScript
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 Extension,这将适用于所有浏览器。复制并粘贴到您的网络驱动程序扩展。
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);
}