BrowserStack: непредвиденная ошибка. Требуется Авторизация - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть два простых теста, которые используют 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>

Ответы [ 6 ]

0 голосов
/ 22 октября 2018

Проблема в том, что 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;
    }
}
0 голосов
/ 17 октября 2018

У нас была такая же проблема.Мы пытались использовать учетные данные в нашем 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);
0 голосов
/ 16 октября 2018

Я столкнулся с той же проблемой и решил ее, установив «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);
0 голосов
/ 11 сентября 2018

Похоже, это проблема, связанная с тем, как привязки языка селена генерируют полезную нагрузку, и как стеки браузера анализируют ее в конце.

Основываясь на сообщении об ошибке, которым вы поделились, вполне вероятно, что при анализе полезной нагрузки браузера не удается найти ваше имя пользователя и ключ доступа

Вы можете выполнить шаги, указанные ниже, для отладки:

  • Измените строку 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, как вы упоминали). Например, мой селен-клиент на основе Java генерирует это, когда передается только браузер с желаемыми возможностями {"desiredCapabilities":{"browserName":"Chrome"},"capabilities":{"firstMatch":[{"browserName":"Chrome"}]}}

  • Теперь понизьте привязки к селену (до версии, в которой он работал) и посмотрите на полезную нагрузку, которую он генерирует.

Проверьте, используют ли клиентские привязки строгие проверки, из-за которых некоторые требуемые возможности отбрасываются с вашей стороны.

Если это так, то вам потребуется выполнить одно из следующих действий:

  • Поднимите проблему с привязками селена C #, чтобы убрать строгие проверки для вашего случая
  • Свяжитесь с Browserstack и попросите их предоставить возможность, которая проходит строгую проверку
0 голосов
/ 10 сентября 2018

Вы пытались добавить параметры как options.ToCapabilities()?

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

Также попробуйте установить в качестве глобальной возможности:

options.AddAdditionalCapability("browserstack.user", _bsUsername, true);
0 голосов
/ 06 сентября 2018

Вы можете передать следующие возможности для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...