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