1

私はオートメーションフレームワークのテストを構築していますが、作成したローカルのHTMLページに移動する際に問題が発生しています。ファイルパスを使用してChromeDriverでローカルファイルをナビゲートするにはどうすればよいですか?

ここでは、ChromeDriverインスタンスを作成しています。私は私のテストだけでなく、抽象テストツールでProtractor-netを使用することができていますように、

if (AllowFileAccessAcrossFiles) 
{ 
    ChromeOptions options = new ChromeOptions(); 
    // Have tried, none, individually, as well as both. 
    options.AddArgument("--allow-file-access-from-files"); 
    options.AddArgument("--enable-local-file-accesses "); 
    driver = new ChromeDriver(options); 
} 

このChromeDriverインスタンスは、後でNgWebDriverクラスに渡されます。

internal TestWebDriver(RemoteWebDriver driver, TestConfiguration configuration) 
{ 
    // ... 

    _driver = new NgWebDriver(driver); 

    // ... 
} 

フレームワークは、それが正しいファイルパス(「ファイル:///を...」)を渡しページに移動するには、ドライバを呼び出し、それは、ブラウザのURLにそれを作ることはありませんとではありませんにナビゲート。 (URLにはdata;と表示されます)

ファイルパスがChromeDriverのローカルHTMLページに移動するにはどうすればよいですか?

答えて

2

この問題に対するこの解決策は、NgWebDriverに根ざしていることが判明しました。 NgWebDriverは、URLにナビゲートするためにIE、エッジ、PhantomJSは、Firefox、およびSafari用のドライバに延期、それは何か他のものであるならば、それだけでこれを実行します:呼び出されているthis.ExecuteScript("window.name += '" + AngularDeferBootstrap + "'; window.location.href = '" + value + "';");

JavaScript methodだけで処理しませんローカルパスを渡すには、ナビゲートするためにhttp(s)文字列が必要です。したがって、ローカルパスを渡すことができるかどうかは、Urlプロパティのsetメソッドの特定のドライバの実装に依存します。

以下は、該当するProtractor-netプロパティです。

public class NgWebDriver : IWebDriver, IWrapsDriver, IJavaScriptExecutor 
{ 
    private const string AngularDeferBootstrap = "NG_DEFER_BOOTSTRAP!"; 

    private IWebDriver driver; 
    private IJavaScriptExecutor jsExecutor; 
    private string rootElement; 
    private IList<NgModule> mockModules; 

    // constructors and stuff 

    /// <summary> 
    /// Gets or sets the URL the browser is currently displaying. 
    /// </summary> 
    public string Url 
    { 
     get 
     { 
      this.WaitForAngular(); 
      return this.driver.Url; 
     } 
     set 
     { 
      // Reset URL 
      this.driver.Url = "about:blank"; 

      // TODO: test Android 
      IHasCapabilities hcDriver = this.driver as IHasCapabilities; 
      if (hcDriver != null && 
       (hcDriver.Capabilities.BrowserName == "internet explorer" || 
       hcDriver.Capabilities.BrowserName == "MicrosoftEdge" || 
       hcDriver.Capabilities.BrowserName == "phantomjs" || 
       hcDriver.Capabilities.BrowserName == "firefox" || 
       hcDriver.Capabilities.BrowserName.ToLower() == "safari")) 
      { 
       this.ExecuteScript("window.name += '" + AngularDeferBootstrap + "';"); 
       this.driver.Url = value; 
      } 
      else 
      { 
       this.ExecuteScript("window.name += '" + AngularDeferBootstrap + "'; window.location.href = '" + value + "';"); 
      } 

      if (!this.IgnoreSynchronization) 
      { 
       try 
       { 
        // Make sure the page is an Angular page. 
        long? angularVersion = this.ExecuteAsyncScript(ClientSideScripts.TestForAngular) as long?; 
        if (angularVersion.HasValue) 
        { 
         if (angularVersion.Value == 1) 
         { 
          // At this point, Angular will pause for us, until angular.resumeBootstrap is called. 

          // Add default module for Angular v1 
          this.mockModules.Add(new Ng1BaseModule()); 

          // Register extra modules 
          foreach (NgModule ngModule in this.mockModules) 
          { 
           this.ExecuteScript(ngModule.Script); 
          } 
          // Resume Angular bootstrap 
          this.ExecuteScript(ClientSideScripts.ResumeAngularBootstrap, 
           String.Join(",", this.mockModules.Select(m => m.Name).ToArray())); 
         } 
         else if (angularVersion.Value == 2) 
         { 
          if (this.mockModules.Count > 0) 
          { 
           throw new NotSupportedException("Mock modules are not supported in Angular 2"); 
          } 
         } 
        } 
       } 
       catch (WebDriverTimeoutException wdte) 
       { 
        throw new InvalidOperationException(
         String.Format("Angular could not be found on the page '{0}'", value), wdte); 
       } 
      } 
     } 
    } 

このプロパティを使用すると、アプリケーションがboolを経由して角度を使用しているかどうか、もう一度、含まれている必要がありますNavigate().GoToUrl()で移動するときに、アプリケーションが、アンギュラ使用していることを前提としていますので。我々の場合には

は、我々は角度使ってGoToUrl()方法にINavigation経由包まIWebDriverに直接呼び出すことを渡していませんでした。このラップされたドライバは、ローカルファイルを正しく処理します。以下は

分度器ネットでnavigation class次のとおりです。

public class NgNavigation : INavigation 
{ 
    private NgWebDriver ngDriver; 
    private INavigation navigation; 

    // irrelevant constructors and such 

    /// <summary> 
    /// Load a new web page in the current browser window. 
    /// </summary> 
    /// <param name="url">The URL to load. It is best to use a fully qualified URL</param> 
    /// <param name="ensureAngularApp">Ensure the page is an Angular page by throwing an exception.</param> 
    public void GoToUrl(string url, bool ensureAngularApp) 
    { 
     if (ensureAngularApp) 
     { 
      this.ngDriver.Url = url; 
     } 
     else 
     { 
      this.navigation.GoToUrl(url); 
     } 
    } 
+0

良い発見。他のWebDriversの上に置かれたNgWebDriverの複雑さをナビゲートするのにいつも楽しい... –

関連する問題