14 votes

Comment utiliser JQuery dans Selenium ?

J'aimerais utiliser Selenium pour cliquer sur l'onglet d'un site web où l'onglet a été créé dynamiquement à l'aide de JQuery. Il y a un problème, puisqu'il a été créé dynamiquement et que l'onglet n'a pas d'ID lié (seulement class-ID fourni), donc je n'ai plus d'indice pour cliquer dessus en utilisant Selenium.

Après avoir cherché pendant 2 semaines, j'ai découvert qu'il était possible d'utiliser JQuery en injectant JQuery dans Selenium et en le reconditionnant pour qu'il supporte l'API JQuery. Mais le problème est que je ne sais pas comment déclencher JQuery script dans Selenium ?

Existe-t-il des ressources ou des directives sur la mise en place de JQuery dans Selenium ? Comment vais-je exécuter JQuery dans Selenium ?

9voto

Nthalk Points 1260

Vous pouvez essayer d'utiliser ma librairie selenium à l'adresse suivante github .

Il gère la quasi-totalité de l'API jquery, à l'exception des fonctions qui utilisent/exigent le passage d'un handler :

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();
}

4voto

Jay Stevens Points 2288

Puisque vous avez dit que vous n'aviez pas d'identifiant mais une classe :

(seul l'identifiant de la classe est fourni)

...une meilleure réponse est probablement d'utiliser la stratégie de localisation CSS qui est déjà intégrée à Selenium et qui permet de sélectionner un élément sur la base d'une classe CSS ou simplement en utilisant la logique du sélecteur CSS (au moins pour css2 et css3).

Ainsi, pour sélectionner un élément (div, span, etc.) qui a une classe spécifique, vous pouvez simplement l'utiliser pour le localisateur Selenium :

css=.class-ID

Vous pouvez même utiliser des sélecteurs plus complexes qui sont similaires à ceux disponibles dans JQuery, tels que :

css=#myDiv .class-ID

Cela permet de rechercher l'élément dont le style css est class-ID à l'intérieur de l'élément avec un ID = myDiv .

4voto

Lei Cao Points 71
  • Tout d'abord, vous pouvez lire le jquery à partir d'un fichier jquery.js ou jquery.min.js.
  • Puis utiliser execute_script(jquery) pour activer dynamiquement jquery.
  • Vous pouvez maintenant interagir avec jquery.

Voici un peu de code :

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 : Quand j'utilise Selenium pour récupérer du contenu sur un site web, ils me bannissent toujours. Il faut donc utiliser un proxy pour passer outre.
Voici un peu de code :

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

3voto

Byron Sommardahl Points 4641

Mon équipe vient de terminer une bibliothèque qui encapsule des fonctions jquery pour les utiliser avec Selenium. Nous venons de terminer notre première version, mais nous prévoyons d'intégrer TOUTES les fonctions de jquery. Cette bibliothèque facilite l'utilisation de jquery à partir de vos tests Selenium en C#. Cela permet d'avoir des tests BEAUCOUP plus propres. Voici le code source : https://github.com/AcklenAvenue/JQSelenium

2voto

Takaaki Kasai Points 21

Vous pouvez utiliser window.jQuery dans la commande getEval :

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

Cela fonctionne pour moi sur Selenium IDE.

Pour FF3, utilisez wrappedJSObject pour obtenir l'objet 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! |

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X