web-dev-qa-db-fra.com

BrowserStack: erreur inattendue. Autorisation requise

J'ai deux tests simples qui utilisent RemoteWebDriver avec ChromeOptions et EdgeOptions. Ces deux tests utilisent un code commun pour définir les fonctionnalités, y compris les fonctionnalités browserstack.user et browserstack.key

Parce que j'utilise DriverOptions (au lieu de DesiredCapabilities), j'ai utilisé AddAdditionalCapability(...) pour ajouter ces fonctionnalités au pilote.

Le test Edge fonctionne mais le test Chrome échoue avant même le début du test.

OpenQA.Selenium.WebDriverException: erreur inattendue. Autorisation requise

Ces tests fonctionnaient auparavant avec DesiredCapabalities avant de mettre à niveau mon pilote Selenium vers la v3.14 (où DesiredCapabalities ont été supprimés).


Mettre à jour

J'ai rétrogradé à Selenium.WebDriver v3.4.

Exemple de code qui passe (EdgeOptions) et qui échoue (avec ChromeOptions):

[TestClass]
public class Simple_GridTest_Chrome
{
    private static IWebDriver driver;

    private string _bsUsername = "<username>";
    private string _bsAccessKey = "<myaccesskey>";

    private string _bsProjectName = "TestProject";
    private string _bsBuildName = "Build-0.0.1";

    private void SetOptions(bool useEdge = false)
    {
        DriverOptions options;

        if (useEdge)
        {
            options = new EdgeOptions(); // this works OK
        } else
        {
            options = new ChromeOptions(); // this fails with OpenQA.Selenium.WebDriverException: Unexpected error. Authorization required
        }

        // the account that is running the test
        options.AddAdditionalCapability("browserstack.user", _bsUsername);
        options.AddAdditionalCapability("browserstack.key", _bsAccessKey);

        options.AddAdditionalCapability("project", _bsProjectName);
        options.AddAdditionalCapability("build", _bsBuildName);

        // gather additional data during the test run (screen shots etc)
        options.AddAdditionalCapability("browserstack.debug", "true");

        driver = new RemoteWebDriver(
          new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options
        );

        //driver = new RemoteWebDriver(
        //  new Uri($"https://{_bsUsername}:{_bsAccessKey}@hub-cloud.browserstack.com/wd/hub/"), options
        //);
    }

    [ClassInitialize()]
    public static void MyClassInitialise(TestContext context)
    {
    }

    [TestMethod]
    [TestCategory("grid.BrowserStack.Google")]
    public void NavigateToGoogle_Windows7_Chrome()
    {
        SetOptions(false); // use Chrome
        GoogleTest(driver);
    }

    [TestMethod]
    [TestCategory("grid.BrowserStack.Google")]
    public void NavigateToGoogle_Windows10_Edge()
    {
        SetOptions(true); // use Edge
        GoogleTest(driver);
    }

    private void GoogleTest(IWebDriver driver)
    {
        driver.Navigate().GoToUrl("https://www.google.com/?q=test");
        Console.WriteLine(driver.Title);

        driver.WaitForWebElement(By.XPath("//*[@name=\"btnK\"]")).Click();
        Console.WriteLine(driver.Title);
    }
}

J'ai les paquets suivants installés:

<packages>
  <package id="Selenium.Firefox.WebDriver" version="0.21.0" targetFramework="net45" />
  <package id="Selenium.Support" version="3.4.0" targetFramework="net45" />
  <package id="Selenium.WebDriver" version="3.4.0" targetFramework="net45" />
  <package id="Selenium.WebDriver.ChromeDriver" version="2.41.0" targetFramework="net45" />
  <package id="Selenium.WebDriver.IEDriver" version="3.14.0" targetFramework="net45" />
</packages>
9
Mark Cooper

Cela semble être un problème spécifique à la façon dont les liaisons de langage Selenium génèrent une charge utile et à la façon dont browserstack les analyse à la fin.

Selon le message d'erreur que vous avez partagé, il est fort probable que, lors de l'analyse du contenu de la demande, browserstack ne puisse pas trouver votre nom d'utilisateur et votre clé d'accès.

Vous pouvez suivre les étapes mentionnées ci-dessous pour déboguer ceci:

  • Modifiez la ligne driver = new RemoteWebDriver(new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options); en driver = new RemoteWebDriver( new Uri("http://localhost:4444/wd/hub/"), options );. Vous n'êtes pas obligé de démarrer le bocal Selenium-standalone localement.

  • Démarrez un proxy qui lit le trafic sur localhost: 4444. (Vous pouvez utiliser une implémentation basée sur les nœuds pour la même chose si nécessaire. En voici une: https://Gist.github.com/hanikhan/f817bd64b063129cb78dc7ed0b66fdb7 )

  • Observez la charge utile de la demande générée par les liaisons client Selenium que vous utilisez (v3.14 comme vous l'avez mentionné). Par exemple, mon client Selenium basé sur Java génère ceci lorsque seul le navigateur est transmis est souhaitécapabitlies {"desiredCapabilities":{"browserName":"Chrome"},"capabilities":{"firstMatch":[{"browserName":"Chrome"}]}}

  • À présent, rétrogradez vos liaisons Selenium (vers une version où elles fonctionnaient) et observez la charge utile générée.

Vérifiez si les liaisons client utilisent des contrôles stricts en raison desquels certaines fonctionnalités requises sont supprimées de votre côté.

Si cela est vrai, vous devrez alors effectuer l'une des opérations suivantes:

  • Signaler un problème avec les liaisons Selenium C # pour supprimer les contrôles stricts de votre cas
  • Contactez Browserstack et demandez-leur de fournir une fonctionnalité qui passe le contrôle strict
4
BountyHunter

Vous pouvez transmettre les fonctionnalités décrites ci-dessous pour Edge et Chrome, en utilisant EdgeOptions et ChromeOptions pour lancer une session sur BrowserStack. Ceci est en Java. Portez votre test en conséquence pour d'autres langues.

Pour Edge

EdgeOptions options = new EdgeOptions();

 options.setCapability("browserstack.user","<userName>");
 options.setCapability("browserstack.key","<accessKey>");
 options.setCapability("os_version", "10"); //desired os_version
 options.setCapability("browser", "chrome"); //desired browser

 driver = new RemoteWebDriver(new URL("https://hub-cloud.browserstack.com/wd/hub"), options);

Pour Chrome

 ChromeOptions options = new ChromeOptions();

    options.setCapability("browserstack.user","<userName>");
    options.setCapability("browserstack.key","<accessKey>");
    options.setCapability("os_version", "10");
    options.setCapability("browser", "chrome");

    driver = new RemoteWebDriver(new URL("https://hub-cloud.browserstack.com/wd/hub"), options);
4
Kireeti Annamaraj

Avez-vous essayé d'ajouter des options en tant que options.ToCapabilities()?

driver = new RemoteWebDriver(
    new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options.ToCapabilities()
);

Essayez également de définir comme capacité globale:

options.AddAdditionalCapability("browserstack.user", _bsUsername, true);
3
Sers

Le problème est que AddAdditionalCapability(string capabilityName, object capabilityValue) ne définit pas les fonctionnalités globalement lorsqu'il est appelé à ChromeOptions, FirefoxOptions et InternetExplorerOptions. Au lieu de cela, il les place dans les options de navigateur spécifiques du JSON. Pour plus d'informations, voir https://github.com/SeleniumHQ/Selenium/issues/6563 .

Comme vous l'avez remarqué, EdgeOption les définit globalement, c'est pourquoi cela fonctionnait pour vous (SafariOptions aurait fonctionné de la même manière).

La raison pour laquelle vous ne voyez pas la surcharge AddAdditionalCapability(string capabilityName, object capabilityValue, bool isGlobalCapability) est que votre variable options est de type DriverOptions, qui ne contient pas cette surcharge. Pour contourner le problème, vous pourriez faire quelque chose comme ceci:

static void AddGlobalCapability(this DriverOptions options, string name, object value)
{
    switch (options)
    {
        case ChromeOptions chromeOptions:
            chromeOptions.AddAdditionalCapability(name, value, true);
            break;
        case FirefoxOptions firefoxOptions:
            firefoxOptions.AddAdditionalCapability(name, value, true);
            break;
        case InternetExplorerOptions internetExplorerOptions:
            internetExplorerOptions.AddAdditionalCapability(name, value, true);
            break;
        default:
            options.AddAdditionalCapability(name, value);
            break;
    }
}
1
Ohad Schneider

J'ai rencontré ce même problème et je l'ai résolu en définissant "isGlobalCapability" sur true pour chaque méthode "AddAdditionalCapability" pour ChromeOptions (à l'aide de Selenium 3.14). Si un seul d'entre eux ne l'a pas défini, le test échoue.

chromeOptions.AddAdditionalCapability("browserstack.user", <user>, true);
chromeOptions.AddAdditionalCapability("browserstack.key", <key>, true);
chromeOptions.AddAdditionalCapability("browser", "chrome", true);
chromeOptions.AddAdditionalCapability("os", "Windows", true);
chromeOptions.AddAdditionalCapability("os_version", "10", true);
_Driver = new RemoteWebDriver(new Uri("http://hub-cloud.browserstack.com/wd/hub/"), chromeOptions);
0
jesse

Nous avons eu le même problème. Nous essayions d'utiliser les informations d'identification dans notre URL, comme dans notre projet Java.

var browserstackUrl = string.Format(
    "https://{0}:{1}@hub-cloud.browserstack.com/wd/hub", 
    browserstackUsername, 
    browserstackAccessKey
);
var webdriver = new RemoteWebDriver(new Uri(BrowserStackUrl), options);

En les déplaçant vers des capacités, nous avons pu surmonter ce problème:

capabilities.SetCapability("browserstack.user", browserstackUsername);
capabilities.SetCapability("browserstack.key", browserstackAccessKey);
var browserstackUrl = "https://hub-cloud.browserstack.com/wd/hub";
var webdriver = new RemoteWebDriver(new Uri(BrowserStackUrl), options);
0
Thunderforge