RemoteWebDriver
とChromeOptions
および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>
_
これは、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バインディングを(機能していたバージョンに)ダウングレードし、生成されるペイロードを観察します。
クライアントバインディングが厳密なチェックを使用しているかどうかを確認します。これにより、必要な機能の一部が最終的に破棄されます。
これが当てはまる場合は、次のいずれかを実行する必要があります。
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);
問題は、AddAdditionalCapability(string capabilityName, object capabilityValue)
がChromeOptions
、FirefoxOptions
、および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;
}
}
オプションをoptions.ToCapabilities()
として追加しようとしましたか?
driver = new RemoteWebDriver(
new Uri("https://hub-cloud.browserstack.com/wd/hub/"), options.ToCapabilities()
);
また、グローバル機能として設定してみてください。
options.AddAdditionalCapability("browserstack.user", _bsUsername, true);
私はこれと同じ問題に遭遇し、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);
これと同じ問題がありました。 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);