Existe-t-il un moyen de détecter que je suis dans une page de Webdriver Selenium de Javascript

Je voudrais supprimer l'initialisation de TinyMCE dans mes tests et je peux le faire facilement si le Javascript peut détecter que je cours dans une page automatisée Selenium.

Alors, y at-il un code JS que je peux utiliser pour détecter le pilote Selenium? Alternativement, comment puis-je étendre la chaîne userAgent pour inclure un modèle que je peux détecter auprès de JS?

Si cela compte vraiment, je l'exécute à travers le concombre et le capybara sur Mac OS X.

Pour autant que je sache, il n'existe pas de méthode de navigateur croisé que Selenium fournit pour détecter qu'il conduit le navigateur. Dans FF, Webdriver définit l'attribut webdriver sur l'élément html mais apparemment pas dans d'autres navigateurs. Peut-être qu'un jour ce sera la façon de détecter que le navigateur est piloté par Selenium mais pas pour le moment. Je viens de le tester avec FF et Chrome: l'attribut était présent dans FF mais pas Chrome. Alors c'est ça …

Une méthode pour n'importe quel navigateur, tout système d'exploitation, n'importe quel coureur de test

Parfois, je dois faire quelque chose comme ce que vous essayez d'atteindre. Je lance de grandes sondes avec Selenium. Ces suites fonctionnent sur plusieurs versions de Chrome, Firefox et IE, sur Linux, Windows et OS X, avec quelques-uns des tests exécutés à distance sur Sauce Labs.

Les méthodes que j'ai utilisées dépendent de executeScript . (Je suis en lien avec le document Java, mais cette méthode existe pour toutes les plates-formes sur lesquelles Selenium est disponible.) Je l'utilise pour exécuter le code du côté du navigateur avant d' exécuter un test. Les deux façons dont j'ai utilisé cette méthode:

  1. Définissez un navigateur variable sur la window que le code de mon navigateur vérifie. Donc, je pourrais par exemple configurer window.running_test_suite_for_foobar = true et ensuite avoir le code pour vérifier cela. Il y a un risque d'affrontement, mais si le nom de la variable est utilisé avec soin, le risque est minime.

  2. Une autre méthode que j'ai utilisée consiste à concevoir mon code afin qu'il dispose d'options de configuration ou de méthodes non documentées qui peuvent être appelées pour le configurer correctement pour un environnement de test ou pour le désactiver complètement. Par exemple, j'ai un module onbeforeunload qui empêche les utilisateurs de s'éloigner d'une page avec des modifications non enregistrées. En test, il n'est pas utile d'avoir ceci généralement activé. Selenium pourrait gérer le popup, mais lorsque vous exécutez des tests à distance, chaque bit d'interaction a un coût important. Ensuite, plusieurs fois par dizaines de tests et vous avez une suite de tests qui peut facilement prendre quelques minutes de plus à exécuter. J'ai donc une méthode que j'appelle pour l'éteindre.

Les problèmes de modification de l'agent utilisateur

  1. Les méthodes pour le faire diffèrent du navigateur vers le navigateur. Votre code doit vérifier le navigateur que vous voulez exécuter, puis exécutez la bonne action en fonction du navigateur.

  2. Les méthodes présentées pour FF et Chrome dans d'autres réponses ici remplacent complètement la chaîne de l'agent utilisateur (contrairement à ce que certains ont dit). Pour y ajouter , vous devriez savoir ce que serait la chaîne non modifiée. Cela passe du navigateur au navigateur et de la version à la version. Je suppose que vous pourriez avoir une table de chaînes d'agent utilisateur stock à modifier. Ce n'est pas quelque chose que je voudrais conserver. Ou vous pouvez commencer le navigateur deux fois: une fois pour interroger l'agent utilisateur et une fois pour exécuter le test avec l'agent utilisateur modifié.

    Et vous ne pouvez pas être paresseux d'utiliser la bonne chaîne d'agent utilisateur. Bien qu'il soit vrai que le code du navigateur devrait faire la détection des fonctionnalités plutôt que la détection du navigateur , il reste quelques cas où le seul moyen raisonnable de savoir que le code doit gérer un cas spécial est de savoir dans quelle version il se déroule. Le problème est un bug dans le navigateur, il n'y a pas de fonctionnalité à vérifier. Vérifier que le bug se produit peut être trop coûteux ou impossible à faire de manière fiable. Le code doit donc vérifier la chaîne de l'agent utilisateur. Votre code peut ne pas avoir à le faire, mais le code tiers peut. (Par exemple, j'ai rencontré un problème qui se produit avec getBoundingClientRect où les coordonnées seraient généralement incorrectes dans IE mais uniquement dans une version de Chrome. Il est trop coûteux de vérifier le bug au moment de l'exécution et je ne peux pas Assurez-vous qu'un changement de police ou de paramètres d'affichage ne produira pas de faux négatifs.)

Puisque la question mentionne Capybara, voici le code équivalent de Ruby:

 profile = Selenium::WebDriver::Firefox::Profile.new profile['general.useragent.override'] = "my ua string" driver = Selenium::WebDriver.for :firefox, :profile => profile 
  1. Puisque Webbriver automatise les navigateurs normaux (tout comme iMacros), votre site ne peut pas le détecter directement.

  2. Vous pouvez facilement ajouter une chaîne à l'agent utilisateur:

C'est facile avec le pilote Firefox:

 FirefoxProfile profile = new FirefoxProfile(); profile.addAdditionalPreference("general.useragent.override", "some UA string"); WebDriver driver = new FirefoxDriver(profile); 

Voici comment le faire avec Capybara et Chromedriver:

 Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new(app, browser: :chrome, args: ['--user-agent="Chrome under Selenium for Capybara"'] ) end 

Oui, vous pouvez le faire si quelqu'un utilise le pilote Firefox pour l'automatisation du sélénium, pour la détection du pilote du sélénium, vous devez mettre le code suivant du côté de votre client:

 $(document).ready(function() { try{ if(window.document.documentElement.getAttribute("webdriver")) alert("Caught in 1st case :- Selenium Webdriver is banned!!!"); } catch(Exception){} try{ if(navigator.webdriver) alert("Caught in 2nd case :- Selenium Webdriver is banned!!!"); } catch(Exception){} }); 

Pour Chrome et le navigateur spécifique au sélénium IE, il ne fonctionne pas.