web-dev-qa-db-ja.com

BrowserStack:予期しないエラー。認証が必要です

RemoteWebDriverChromeOptionsおよびEdgeOptionsを使用する2つの簡単なテストがあります。これらのテストは両方とも、共通のコードを使用して、_browserstack.user_および_browserstack.key_機能を含む機能を設定しています。

DriverOptionsの代わりに)DesiredCapabilitiesを使用しているため、AddAdditionalCapability(...)を使用してこれらの機能をドライバーに追加しました。

エッジテストは機能していますが、Chromeテストは、テストが開始される前に失敗しています。

OpenQA.Selenium.WebDriverException:予期しないエラー。認証が必要です

これらのテストは、Selenium Driverをv3.14(DesiredCapabalitiesが廃止された)にアップグレードする前は、以前はDesiredCapabalitiesで機能していました。


更新

Selenium.WebDriverv3.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>
_
12
Mark Cooper

これは、Selenium言語バインディングがペイロードを生成する方法と、browserstackがペイロードを最後に解析する方法に固有の問題のようです。

共有したエラーメッセージに基づくと、リクエストペイロードの解析中に、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 );に変更します。 Selenium-standalonejarをローカルで起動する必要はありません。

  • Localhost:4444のトラフィックを読み取るプロキシを開始します。 (必要に応じて、同じものにノードベースの実装を使用できます。そのような実装の1つを次に示します: https://Gist.github.com/hanikhan/f817bd64b063129cb78dc7ed0b66fdb7

  • 使用しているSeleniumクライアントバインディング(前述のv3.14)によって生成されたリクエストペイロードを確認します。たとえば、私のJavaベースのSeleniumクライアントは、ブラウザのみが渡されたときにこれを生成します。capabitlies{"desiredCapabilities":{"browserName":"Chrome"},"capabilities":{"firstMatch":[{"browserName":"Chrome"}]}}

  • 次に、Seleniumバインディングを(機能していたバージョンに)ダウングレードし、生成されるペイロードを観察します。

クライアントバインディングが厳密なチェックを使用しているかどうかを確認します。これにより、必要な機能の一部が最終的に破棄されます。

これが当てはまる場合は、次のいずれかを実行する必要があります。

  • Selenium C#バインディングの問題を提起して、ケースの厳密なチェックを削除します
  • Browserstackに連絡して、厳密なチェックに合格する機能を提供するように依頼してください
5
BountyHunter

EdgeとChrome EdgeOptionsとChromeOptionsを使用してBrowserStackでセッションを開始する)の両方について、以下の機能に合格できます。これはJavaです。他の言語に応じてテストを移植してください。

エッジの場合

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);
4

問題は、AddAdditionalCapability(string capabilityName, object capabilityValue)ChromeOptionsFirefoxOptions、およびInternetExplorerOptionsで呼び出されたときに、機能をグローバルに設定しないことです。むしろ、JSONの特定のブラウザーオプション内にそれらを配置します。詳細については、 https://github.com/SeleniumHQ/Selenium/issues/656 を参照してください。

お気づきのように、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;
    }
}
3
Ohad Schneider

オプションをoptions.ToCapabilities()として追加しようとしましたか?

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

また、グローバル機能として設定してみてください。

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

私はこれと同じ問題に遭遇し、ChromeOptionsのすべての「AddAdditionalCapability」メソッドで「isGlobalCapability」をtrueに設定することで解決しました(Selenium 3.14を使用)。そのうちの1つだけに設定されていない場合、テストは失敗します。

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);
1
jesse

これと同じ問題がありました。 Javaプロジェクトの場合と同様に、URLで資格情報を使用しようとしました。

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
Thunderforge