Comment puis-je importer un fichier .js externe sur mon test Java avec Selenium dans Eclipse?

Je souhaite importer ma fonction de JavaScript dans mon projet Java dans Eclipse et l'utiliser avec Selenium, mais je ne trouve pas le formulaire pour le faire.

J'essaie de créer un fichier .js comme ceci pour que Selenium puisse reconnaître ce code:

Selenium.prototype.doProve = function() { $("#proveDiv > div > div").each(function(i, obj) { $(i).click(function(){}); }); }; 

Eh bien, comme vous pouvez le voir, j'ai 3 divs et ce que je veux faire c'est d'accéder à la troisième div dans laquelle j'ai 2 divs plus (c'est l'indice de la boucle). Dans chaque div de la boucle, je veux faire un clic.

J'ai essayé d'utiliser cette fonction dans mon projet Java, mais je ne peux pas obtenir de résultat, alors j'ai essayé d'exécuter cette fonction en tant que Chaîne puis d'exécuter le script comme ceci:

 String script = "$(\"#proveDiv > div > div" + "\").each(function(i, obj){ " + "$(i).click(function(){});})"; //Executing script if (driver instanceof JavascriptExecutor) { ((JavascriptExecutor) driver).executeScript(script); } 

Cela fonctionne, mais ce n'est pas très utile, car je veux créer un fichier .js externe contenant toutes les fonctions JavaScript et les appeler à partir de là, pas dans une Chaîne.

Toute aide serait appréciée. J'ai vu quelques questions ici, mais l'une d'elles a travaillé pour moi. Merci beaucoup!

Cela fonctionne, mais ce n'est pas très utile, car je veux créer un fichier .js externe contenant toutes les fonctions JavaScript et les appeler à partir de là, pas dans une Chaîne.

Vous pouvez le faire uniquement en chargeant votre fichier js externe dans le DOM

 var addscript=window.document.createElement('script');addscript.type='text/javascript';addscript.src='http://localhost/somescript.js';document.getElementsByTagName('body')[0].appendChild(addscript); 

Remarque : la plupart des navigateurs ne vous permettent pas de charger des ressources locales, alors placez votre fichier js externe dans un serveur Web local et accédez-y comme http: //localhost/somescript.js

Après avoir chargé le fichier js dans DOM maintenant, vous pouvez appeler les fonctions javascript dans le fichier js externe

Exemple

Disons que nous avons un fichier js externe nommé somescript.js qui contient la fonction ci-dessous

 //simple function which sets the value "test" to the search box window.somefunc = function () {document.getElementsByName("s")[0].value='test';} 

Code webdriver :

  driver.get("http://www.jquery.com"); //Load the External js file into DOM ((JavascriptExecutor) driver) .executeScript("var addscript=window.document.createElement('script');addscript.type='text/javascript';addscript.src='http://localhost/somescript.js';document.getElementsByTagName('body')[0].appendChild(addscript);"); //wait for the js to be loaded to the DOM ((JavascriptExecutor) driver) .executeScript("return typeof(somefunc)").toString().equals("function"); //Now you call the JavaScript functions in the JS file ((JavascriptExecutor) driver) .executeScript("somefunc();"); 

Remarque : derrière les scènes, Selenium enveloppe votre code JavaScript dans une fonction anonyme . Donc, votre fonction somefunc est locale à cette fonction anonyme. Et en raison des règles de portée de JavaScript, somefunc n'existe pas en dehors de cette fonction anonyme. Nous avons donc fait une fonction globale en l'affectant à la fenêtre.

EDIT :

Et je ne comprends pas vraiment pourquoi vous utilisez la déclaration de la fenêtre. Et je cherchais quelque chose comme un pilote ((JavascriptExecutor)) .executeScript ("ici le .js"); Mais je ne sais pas si c'est possible

C'est ainsi que la méthode executeScript exécute le javascript fourni

Le fragment de script fourni sera exécuté comme le corps d'une fonction anonyme.

Exemple si nous avons utilisé le code ci-dessous

 ((JavascriptExecutor) driver) .executeScript("somefunc = function () {document.getElementsByName("s")[0].value='test';}"); ((JavascriptExecutor) driver) .executeScript("somefunc();"); (function() { somefunc = function () {document.getElementsByName("s")[0].value='test';} })(); (function() { somefunc(); }); 

Qu'entendez-vous par où vous dites que vous souhaitez mettre le fichier .j externe dans le DOM?

Par DOM, je veux dire Document modèle d'objet de la page construite comme un arbre d'Objets (en bref, votre page Web). Nous utilisons javascript pour charger les js externes vers la page Web, puis appeler les fonctions dans le fichier js et les exécuter (comme dans le fichier js Exemple ci-dessus).

Dans le code que vous avez mis dans votre édition. Les deux fonctions sont les mêmes?

Je viens de donner un exemple de ce que je voulais dire: chaque script fourni dans le script d'exécution sera exécuté dans le corps d'une fonction anonyme. Dans notre cas, nous n'avons pas utilisé executescript pour créer la fonction somefunc plutôt utilisée à partir du fichier js externe Dans dom, nous l'appelions uniquement en utilisant la méthode executescript afin que vous puissiez le faire avec ou sans l'objet fenêtre

  //simple function which sets the value "test" to the search box somefunc = function () {document.getElementsByName("s")[0].value='test';}//this will also work 

J'espère que cela vous aidera. Reconnaissez vite si vous avez des questions.

Vous pouvez stocker le javascript dans un fichier comme un fichier propriétés ou xml.

Exemple de fichier:

 clickOnLoginButton=function bclick(){....};bclick(); 

Exemple de code:

 FileInputStream file; Properties properties = new Properties(); // load the file handle for properties file file = new FileInputStream(filename); // load all the properties from this file properties.load(file); // we have loaded the properties, so close the file handle file.close(); String mainExecutor = properties.getProperty(parameter); WebDriver dr = initalizeWebDriver(); JavascriptExecutor js = (JavascriptExecutor) dr; js.executeScript(mainExecutor);