Selenium driver.Url vs. driver.Navigate(). GoToUrl()

Какой предпочтительный метод для открытия Url (и есть ли какие-либо различия за кулисами между ними):

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, но не повезло).

Ответ 1

Selenium - это среда с открытым исходным кодом, поэтому, пожалуйста, ознакомьтесь с исходным кодом здесь.

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() более гибкий, что позволяет отправлять либо string, либо Uri в качестве типов параметров, тогда как при настройке через driver.Url допускается использовать только строку.


К вашему второму вопросу исходный код показывает, что driver.Navigate().Refresh() запрашивает обновление браузеров, а driver.Url указывает браузеру перемещаться. Так что эти два принципиально разные. Для получения дополнительной информации см. Разница между функцией обновления и навигации в браузере?

Если вы хотите обновить страницу, используйте driver.Navigate().Refresh();

Refresh() определяется в RemoteNavigator.cs:

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

driver.Url определяется в RemoteWebDriver.cs:

public string Url
{
    ...

    set
    {
        ...

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