BrowserStack: непредвиденная ошибка. Требуется Авторизация
У меня есть два простых теста, которые используют RemoteWebDriver
с ChromeOptions
а также EdgeOptions
, Оба эти теста используют общий код для настройки возможностей, включая browserstack.user
а также browserstack.key
возможностей.
Потому что я использую DriverOptions
(вместо DesiredCapabilities
) Я использовал AddAdditionalCapability(...)
добавить эти возможности в драйвер.
Тест Edge работает, но тест Chrome терпит неудачу еще до того, как тест начнется;
OpenQA.Selenium.WebDriverException: непредвиденная ошибка. Требуется Авторизация
Эти тесты ранее работали с DesiredCapabalities
до того, как я обновил свой Selenium Driver до версии 3.14 (где DesiredCapabalities
были осквернены).
Обновить
Я опустился до Selenium.WebDriver v3.4.
Пример кода, который проходит (EdgeOptions) и терпит неудачу (с 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);
}
}
У меня установлены следующие пакеты:
<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>
7 ответов
Это кажется проблемой, специфичной для того, как привязки языка селена генерируют полезную нагрузку и как браузерный стэк анализирует ее в конце.
Судя по сообщению об ошибке, которым вы поделились, вполне вероятно, что при анализе полезной нагрузки запроса, browserStack не может найти ваше имя пользователя и ключ доступа
Вы можете выполнить шаги, указанные ниже, чтобы отладить это:
Изменить линию
driver = new RemoteWebDriver(new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options);
вdriver = new RemoteWebDriver( new Uri("http://localhost:4444/wd/hub/"), options );
, От вас не требуется запускать селеновый сосуд локально.Запустите прокси, который читает трафик на localhost:4444. (Вы можете использовать реализацию на основе узла для того же самого, если это необходимо. Вот одна из таких реализаций: https://gist.github.com/hanikhan/f817bd64b063129cb78dc7ed0b66fdb7)
Наблюдайте полезную нагрузку запроса, генерируемую привязками клиента selenium, которые вы используете (v3.14, как вы упомянули). Например, мой клиент Selen на основе Java генерирует это, когда передается только браузер
{"desiredCapabilities":{"browserName":"Chrome"},"capabilities":{"firstMatch":[{"browserName":"Chrome"}]}}
Теперь понизьте привязки к селену (до версии, в которой он работал) и посмотрите, какую полезную нагрузку он создает.
Проверьте, используют ли клиентские привязки строгие проверки, из-за которых некоторые требуемые возможности отбрасываются с вашей стороны.
Если это так, то вам потребуется выполнить одно из следующих действий:
- Поднимите проблему с привязками селена C#, чтобы убрать строгие проверки для вашего случая
- Свяжитесь с Browserstack и попросите их предоставить возможность, которая проходит строгую проверку.
Я столкнулся с этой же проблемой и решил ее, установив "isGlobalCapability" в true для каждого метода "AddAdditionalCapability" для ChromeOptions (используя Selenium 3.14). Если только один из них не настроен, тест не пройден.
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);
Вы можете передать следующие возможности для Edge и Chrome, используя EdgeOptions и ChromeOptions, чтобы инициировать сеанс на BrowserStack. Это на Яве. Портируйте свой тест соответственно для других языков.
Для края
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);
Для 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);
Проблема в том, что AddAdditionalCapability(string capabilityName, object capabilityValue)
не устанавливает возможности глобально при вызове ChromeOptions
, FirefoxOptions
, а также InternetExplorerOptions
, Скорее, он помещает их в определенные параметры браузера в JSON. Для получения дополнительной информации см. https://github.com/SeleniumHQ/selenium/issues/6563.
Как вы заметили, EdgeOption
устанавливает их глобально, поэтому это работает для вас (SafariOptions
работал бы так же, кстати).
Теперь причина, по которой вы не видите AddAdditionalCapability(string capabilityName, object capabilityValue, bool isGlobalCapability)
перегрузка в том, что ваш options
переменная имеет тип DriverOptions
, который не содержит этой перегрузки. В качестве обходного пути вы можете сделать что-то вроде этого:
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;
}
}
Вы пытались добавить параметры как options.ToCapabilities()
?
driver = new RemoteWebDriver(
new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options.ToCapabilities()
);
Также попробуйте установить в качестве глобальной возможности:
options.AddAdditionalCapability("browserstack.user", _bsUsername, true);
Проблема, похоже, связана с ChromeOptions и FirefoxOptions. Я использовал EdgeOptions для запуска тестов как в Chrome, так и в Firefox, и, похоже, он работает, как ожидалось.
Сначала используйте переменную Dictionary для создания специальных параметров BrowserStack, как указано ниже.
Dictionary<string, object> browserstackOptions = new Dictionary<string, object>();
browserstackOptions.Add("os", "Windows");
browserstackOptions.Add("osVersion", "10");
browserstackOptions.Add("seleniumVersion", "3.14.0");
browserstackOptions.Add("userName", "USERNAME");
browserstackOptions.Add("accessKey", "ACCESS_KEY");
Затем используйте приведенный ниже код для Chrome.
DriverOptions options = new EdgeOptions();
options.AddAdditionalCapability("browserName", "Chrome");
options.BrowserVersion = "latest";
options.AddAdditionalCapability("bstack:options", browserstackOptions);
Или используйте приведенный ниже код для Firefox.
DriverOptions options = new EdgeOptions();
options.AddAdditionalCapability("browserName", "Firefox");
options.BrowserVersion = "latest";
options.AddAdditionalCapability("bstack:options", browserstackOptions);
Я также предоставил ссылку на свой репозиторий C# Github для вашей справки.
У нас была такая же проблема. Мы пытались использовать учетные данные в нашем URL, как мы делаем в нашем проекте Java.
var browserstackUrl = string.Format(
"https://{0}:{1}@hub-cloud.browserstack.com/wd/hub",
browserstackUsername,
browserstackAccessKey
);
var webdriver = new RemoteWebDriver(new Uri(BrowserStackUrl), options);
Переместив их в возможности, мы смогли обойти эту проблему:
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);