Как использовать JQuery в Selenium? - PullRequest
12 голосов
/ 13 июля 2010

Я хотел бы использовать Selenium, чтобы щелкнуть по вкладке в Интернете, где вкладка была создана динамически с использованием JQuery.Есть одна проблема, так как она была создана динамически, и к вкладке не привязан идентификатор (только предоставленный идентификатор класса), поэтому у меня не хватает подсказки, чтобы щелкнуть по ней с помощью Selenium.

После двухнедельного поиска в Google я обнаружил, что это можно сделать с помощью JQuery, добавив JQuery в Selenium и упакуя его так, чтобы он поддерживал JQuery API.Но проблема в том, что я не знаю, как запустить сценарий JQuery в Selenium?

Есть ли какие-либо ресурсы или рекомендации по настройке JQuery в Selenium?Как я собираюсь выполнить JQuery в Selenium?

Ответы [ 6 ]

9 голосов
/ 07 декабря 2011

Вы можете попробовать использовать мой selenium lib на github .

Он обрабатывает почти весь API jquery, за исключением функций, которые используют / требуют передачи обработчика:

HtmlUnitDriver drv = new HtmlUnitDriver(BrowserVersion.FIREFOX_3_6);
drv.setJavascriptEnabled(true);
try {
  jQueryFactory jq = new jQueryFactory();
  jq.setJs(drv);

  drv.get("http://google.com");
  jq.query("[name=q]").val("SeleniumJQuery").parents("form:first").submit();

  String results = jq.queryUntil("#resultStats:contains(results)").text();
  System.out.println(results.split(" ")[1] + " results found!");
} finally {
  drv.close();
}
4 голосов
/ 08 октября 2010

Так как вы сказали, что у вас нет удостоверения личности, но есть класс:

(предоставляется только идентификатор класса)

... лучшим ответом, вероятно, будет использование стратегии локатора CSS, уже встроенной в Selenium, где вы можете выбрать элемент на основе класса css или просто с помощью логики селектора CSS (по крайней мере для css2 и css3 )

Таким образом, чтобы выбрать элемент (div, span независимо), который имеет определенный класс, вы можете просто использовать его для локатора Selenium:

css=.class-ID

Вы даже можете использовать более сложные селекторы, похожие на те, что доступны в JQuery, такие как:

css=#myDiv .class-ID

Будет выполнен поиск элемента со стилем css class-ID в элементе с идентификатором = myDiv.

3 голосов
/ 29 сентября 2012

Моя команда только что закончила библиотеку, которая упаковывает функции jquery для использования с Selenium.Мы только что закончили нашу первую версию, но планируем обернуть ВСЕ функции jquery.Эта библиотека позволяет легко использовать jquery из ваших тестов Selenium в C #.Это делает для гораздо более чистых тестов.Вот исходный код: https://github.com/AcklenAvenue/JQSelenium

3 голосов
/ 15 августа 2012
  • Сначала вы можете прочитать jquery из файла jquery.js или jquery.min.js.
  • Затем с помощью execute_script (jquery) для динамического включения jquery.
  • Теперь вы можете взаимодействовать с jquery.

вот код:

browser = webdriver.Firefox() # Get local session of firefox

with open('jquery.min.js', 'r') as jquery_js: #read the jquery from a file
    jquery = jquery_js.read()
    browser.execute_script(jquery)  #active the jquery lib

#now you can write some jquery code then execute_script them
js = """
    var str = "div#myPager table a:[href=\\"javascript:__doPostBack('myPager','%s')\\"]"
    console.log(str)
    var $next_anchor = $(str);
    if ($next_anchor.length) {
        return $next_anchor.get(0).click(); //do click and redirect
    } else {
        return false;
    }""" % str(25) 

success = browser.execute_script(js)
if success == False:
    break

PS: Когда я использую Selenium для загрузки некоторого контента с какого-то сайта, они всегда забанят меня. Теперь вы должны использовать прокси-сервер, чтобы пройти через него.
вот код:

PROXY_HOST = "127.0.0.1"
PROXY_PORT = 8087
SOCKS_PORT = 8088

fp = webdriver.FirefoxProfile()

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
fp.set_preference("network.proxy.type", 1)

fp.set_preference("network.proxy.http", PROXY_HOST)
fp.set_preference("network.proxy.http_port", PROXY_PORT)
fp.set_preference("network.proxy.socks", PROXY_HOST)
fp.set_preference("network.proxy.socks_port", SOCKS_PORT)
fp.set_preference("network.proxy.ftp", PROXY_HOST)
fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
fp.set_preference("network.proxy.ssl", PROXY_HOST)
fp.set_preference("network.proxy.ssl_port", PROXY_PORT)

fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired

browser= webdriver.Firefox(firefox_profile=fp) # with proxy
browser = webdriver.Firefox() # no proxy
browser.get("http://search.example.com") # Load page

elem = browser.find_element_by_id("query_box") # Find the query input
elem.send_keys(u'my query string') # send query string to the input
elem.submit() # submit the query form
2 голосов
/ 03 апреля 2012

Вы можете использовать window.jQuery в команде getEval:

|getEval | window.jQuery('div#main button').click(); | |

У меня работает в Selenium IDE.

Для FF3 используйте wrappedJSObject, чтобы получить объект jQuery:

|getEval | win = (this.page().getCurrentWindow().wrappedJSObject) ? this.page().getCurrentWindow().wrappedJSObject : this.page().getCurrentWindow() | |
|getEval | jq = win.jQuery | |
|assertEval | jq("div#main button").text() | click me! |
0 голосов
/ 14 июля 2010

Вы бы запускали jquery так же, как запускали бы какой-нибудь java-скрипт, который вставляете. Попробуйте это с практическими рекомендациями: http://seleniumhq.org/docs/05_selenium_rc.html#learning-the-api

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...