私はSelenium WebDriverを初めて使用し、XPath式やIDなどを使用する代わりにjQueryセレクターを使用して要素を操作する方法を学んでいます...
Selenium WebDriverでjQueryを使用する方法についての基本的な情報を見つけることができるリンクを提供することで、私を助けていただけませんか?
あなたはすべきではない。 jQueryセレクターは、CSS 2およびCSS 3セレクターのほとんどの機能に加えて、さらに多くの機能を提供しますが、おそらくそれがなくても問題ありません。 JQueryセレクターを知っている場合は、CSSセレクターをすでに知っています。
可能な場合はCSSセレクターを使用し、不十分な場合(より強力な場合)はXPath式を使用します。これら2つでは不十分な実際の使用法がたくさんあるとは思えません(そして、通常のアプローチは、できることを取得してコレクションを反復処理し、結果を手動でフィルター処理することです)。
つまり、WebDriverがJQueryセレクターを受け入れるように強制することもできます。
1つまたは2つのブラウザーのみをサポートする場合、最も簡単な方法は、そのブラウザーに単純なアドオンを記述して、JQueryがまだ存在しない場合にすべてのページにJQueryを挿入することです。次に、このアドオンを、使用しているブラウザで使用するように強制します。
すべてのブラウザーをサポートする場合、そのソリューションはすぐに負担となり、最善の方法は、findElements()
の前にJQueryをページに挿入しようとするWebDriverのデコレーターを作成することです。 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
オブジェクト、または装飾されたWebDriverの新しいfindElement(String jQuerySelector)
メソッドに簡単にラップできますが、それは、利便性と遅延にかかっているため、機能します...
最善の方法は、By
という新しいByJQuery
実装を作成することだと思います。 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 Extension、これはすべてのブラウザーで機能します。コピーして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();", "");
1の代わりに任意のjqueryセレクターを使用でき、click()の代わりに任意のイベントを使用できます。