11
votes

Comment activer le support de géolocalisation dans ChromeRiver?

J'ai besoin de tester une fonctionnalité de géolocalisation JS avec sélénium et j'utilise ChromeRiver pour exécuter le test sur le dernier chrome.

Le problème est maintenant que Chrome m'emporte d'activer la géolocalisation pendant le test et que je ne sais pas comment cliquer sur cette petite barre à l'exécution, donc je cherche désespérément un moyen de démarrer le chromedriver et le chrome avec une certaine option ou déclencher pour activer cela par défaut. Tout ce que je pouvais trouver ici était cependant comment je peux désactiver la géolocalisation.

Comment puis-je résoudre ce problème?


0 commentaires

8 Réponses :


3
votes

approche qui a fonctionné pour moi dans Firefox était de visiter ce site manuellement, donnez-vous à ces autorisations et de copier le profil Firefox quelque part à l'extérieur et créez une instance SELENIUM Firefox avec ce profil.

SO:

  1. cp -r ~ / bibliothèque / application \ support / firefox / profils / tp3khne7.default /tmp/ff.profile

  2. Création de l'instance FF: XXX

    Je suis sûr que quelque chose de similaire devrait être applicable à Chrome. Bien que l'API du chargement du profil soit un peu différent. Vous pouvez le vérifier ici: http://code.google.com/p/selenium/wiki / Chromedriver


1 commentaires

Merci pour l'indice utile, pas tout à fait ce que je cherchais (car la partie hôte de l'URL de l'URL que je charge peut changer dans le temps, je devrais mettre à jour le profil à chaque fois ou fournir des profils différents), mais mieux que rien de maintenant.



3
votes

Voici comment je l'ai fait avec Capybara pour des tests de concombre xxx

et il y a un lien vers d'autres paramètres de profil utile: Pref_Names.cc

consultez "Tweaking Profil Préférences" dans Rubybindings


0 commentaires

17
votes

Dans la section Problèmes connus de la chromedriver wiki Ils ont dit que vous Impossible de spécifier un Profil personnalisé

C'est pourquoi il me semble que @sotomajor Répondez à propos de l'utilisation de profil avec Chrome comme vous le feriez avec Firefox ne fonctionnera pas.

Dans l'un de mes tests d'intégration, je suis confronté à le même problème. Mais parce que je n'étais pas dérangé par les vraies valeurs de géolocalisation, tout ce que je devais faire est de simuler la fenêtre.navigator.gelocation

en vous Code de test Java Mettez cette solution de contournement pour éviter la barre d'information de la permission de Geoloc Chrome. xxx

latitude (555) et longitude (999) Les valeurs sont simplement de la valeur de test


2 commentaires

Les valeurs retournées doivent être des chiffres scalaires et non des chaînes.


Juste pour souligner que ce même JS fonctionnera sur Safari / Chrome



1
votes

Quant à votre question initiale:

Vous devez démarrer Firefox manuellement une fois - et sélectionnez le profil que vous utilisez pour sélénium.

type à propos de: autorisations dans la ligne d'adresse; Trouvez le nom de votre hôte - et sélectionnez Share Emplacement: "Autoriser" .

C'est tout. Maintenant, vos cas de test de sélénium ne verront pas cette boîte de dialogue du navigateur redouté qui n'est pas dans le DOM.


0 commentaires

0
votes

La géolocalisation la plus simple à définir consiste à naviguer sur cette URL et à cliquer sur Autoriser l'emplacement par sélénium. Voici le code de référence

 driver.navigate().to("chrome://settings/content");
    driver.switchTo().frame("settings");
    WebElement location= driver.findElement(By.xpath("//*[@name='location' and @value='allow']"));
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    ((JavascriptExecutor) driver).executeScript("arguments[0].click();", location);
     WebElement done= driver.findElement(By.xpath(""));

    driver.findElement(By.xpath("//*[@id='content-settings-overlay-confirm']")).click();

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    driver.navigate().to("url");


0 commentaires

1
votes

Nous venons de trouver une approche différente qui nous permet d'activer la géolocalisation sur Chrome (actuellement 65.0.3325.181 (Build officiel) (64 bits)) sans moquer de la fonction JavaScript natale.

L'idée est d'autoriser le site actuel ( Représenté par baseurls.root.absolantsuri code>) Pour accéder aux informations de géolocalisation. P>

public static void UseChromeDriver(string lang = null)
{
    var options = new ChromeOptions();
    options.AddArguments(
       "--disable-plugins",   
       "--no-experiments", 
       "--disk-cache-dir=null");

    var geolocationPref = new JObject(
        new JProperty(
            BaseUrls.Root.AbsoluteUri,
            new JObject(
                new JProperty("last_modified", "13160237885099795"),
                new JProperty("setting", "1")
            )
        )
     );

  options.AddUserProfilePreference(
      "content_settings.exceptions.geolocation", 
       geolocationPref);

    WebDriver = UseDriver<ChromeDriver>(options);
}

private static TWebDriver UseDriver<TWebDriver>(DriverOptions aDriverOptions)
    where TWebDriver : RemoteWebDriver
{
    Guard.RequiresNotNull(aDriverOptions, nameof(UITestsContext), nameof(aDriverOptions));

    var webDriver = (TWebDriver)Activator.CreateInstance(typeof(TWebDriver), aDriverOptions);
    Guard.EnsuresNotNull(webDriver, nameof(UITestsContext), nameof(WebDriver));

    webDriver.Manage().Window.Maximize();
    webDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
    webDriver.NavigateToHome();

    return webDriver;
}


0 commentaires

0
votes

J'ai pris votre méthode mais cela ne peut pas fonctionner. Je n'ai pas trouvé "baseurls.root.absoluteuri" dans les préférences de Chrome config. Et utilisez un script pour tester xxx


0 commentaires

0
votes
ChromeOptions options = new ChromeOptions();
    HashMap<String, Integer> contentSettings = new HashMap<String, Integer>();
    HashMap<String, Object> profile = new HashMap<String, Object>();
    HashMap<String, Object> prefs = new HashMap<String, Object>();

    contentSettings.put("geolocation", 1);
    contentSettings.put("notifications", 2);
    profile.put("managed_default_content_settings", contentSettings);
    prefs.put("profile", profile);
    options.setExperimentalOption("prefs", prefs);

0 commentaires