2014-09-11 19 views
10

哪一個是優選的方法,以打開一個URL(以及是否有之間的幕後的任何差異):硒driver.Url與driver.Navigate()GoToUrl()

driver.Url = "http://example.com"; 

driver.Navigate().GoToUrl("http://example.com"); 

另外,如果驅動程序已經指向同一頁面,第二次設置Url會導致頁面刷新?

... 
driver.Url = "http://example.com"; 
driver.Url = "http://example.com"; //does this reload the page? 
... 

FWIW我使用的是Chrome瀏覽器的驅動程序chromedriver.exe,但它並不似乎是一個管理組件(我試圖與ILSpy,但沒有運氣打開它)。

回答

21

Selenium是一個開源框架,所以請看源代碼here

GoToUrl()RemoteNavigator.cs定義:

/// <summary> 
/// Navigate to a url for your test 
/// </summary> 
/// <param name="url">String of where you want the browser to go to</param> 
public void GoToUrl(string url) 
{ 
    this.driver.Url = url; 
} 

/// <summary> 
/// Navigate to a url for your test 
/// </summary> 
/// <param name="url">Uri object of where you want the browser to go to</param> 
public void GoToUrl(Uri url) 
{ 
    if (url == null) 
    { 
     throw new ArgumentNullException("url", "URL cannot be null."); 
    } 

    this.driver.Url = url.ToString(); 
} 

所以基本上driver.Navigate().GoToUrl();driver.Url引擎蓋下,我看不出有什麼差別。

然而,driver.Navigate().GoToUrl()是更靈活的,它允許發送或者stringUri作爲參數類型,同時通過設置driver.Url當只有字符串被允許。


你的第二個問題,源代碼顯示了driver.Navigate().Refresh()要求瀏覽器刷新,而driver.Url告訴瀏覽器來瀏覽。所以這兩個是根本不同的。有關詳細信息,請參閱Difference between Refresh and Navigate function in browser control?

如果要刷新頁面,請使用driver.Navigate().Refresh();

Refresh()RemoteNavigator.cs定義:

/// <summary> 
/// Refresh the browser 
/// </summary> 
public void Refresh() 
{ 
    // driver.SwitchTo().DefaultContent(); 
    this.driver.InternalExecute(DriverCommand.Refresh, null); 
} 

driver.UrlRemoteWebDriver.cs定義:

public string Url 
{ 
    ... 

    set 
    { 
     ... 

     try 
     { 
      this.Execute(DriverCommand.Get, parameters); 
     } 
     ... 
    } 
} 
+0

看看你提供的源代碼看起來像我的seco的答案nd問題是肯定的 - 代碼總是告訴驅動程序重新加載頁面,即使Url沒有改變。 – 2014-09-12 03:13:15

+0

@steve:是的,這取決於你如何定義單詞「重新加載」和「刷新」。 ;) – 2014-09-12 11:23:35