Selenium WebDriver - Как установить время загрузки страницы с помощью C #

Я использую Selenium 2.20 WebDriver для создания браузера Firefox и управления им с помощью C #. Чтобы посетить страницу, я использую следующий код, устанавливая тайм-ауты драйвера перед посещением URL:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); // Set implicit wait timeouts to 5 secs
driver.Manage().Timeouts().SetScriptTimeout(new TimeSpan(0, 0, 0, 5));  // Set script timeouts to 5 secs
driver.Navigate().GoToUrl(myUrl);   // Goto page url

Проблема в том, что иногда страницы загружаются вечно, и кажется, что время ожидания по умолчанию для загрузки страницы с использованием selenium WebDriver составляет 30 секунд, что слишком долго. И я не верю, что установленные мной тайм-ауты применимы к загрузке страницы с помощью метода GoToUrl ().

Поэтому я пытаюсь выяснить, как установить тайм-аут для загрузки страницы, однако я не могу найти какое-либо свойство или метод, который действительно работает. 30-секундный тайм-аут по умолчанию также применяется к моменту, когда я щелкаю элемент.

Есть ли способ установить тайм-аут загрузки страницы на определенное значение, чтобы при вызове метода GoToUrl () он только ожидал моего указанного времени, прежде чем продолжить?

Ответы на вопрос(7)

У нас, бразильцев, есть слово для дурацких обходных путей "Гамбиарра" ... Ну ... по крайней мере, они делают свою работу ... Вот мой:

var url = "www.your.url.here"
try {
    DRIVER.Navigate().GoToUrl(url);
} catch {
    // Here you can freely use the Selenium's By class:
    WaitElement(By.Id("element_id_or_class_or_whatever_to_be_waited"), 60);
}
// rest of your application

Что моеWaitElement(By, int) делает:

/// <summary>
/// Waits until an element of the type <paramref name="element"/> to show in the screen.
/// </summary>
/// <param name="element">Element to be waited for.</param>
/// <param name="timeout">How long (in seconds) it should be waited for.</param>
/// <returns>
/// False: Never found the element. 
/// True: Element found.
/// </returns>
private bool WaitElement(By element, int timeout)
{
    try {
        Console.WriteLine(
/// <summary>
/// Waits until an element of the type <paramref name="element"/> to show in the screen.
/// </summary>
/// <param name="element">Element to be waited for.</param>
/// <param name="timeout">How long (in seconds) it should be waited for.</param>
/// <returns>
/// False: Never found the element. 
/// True: Element found.
/// </returns>
private bool WaitElement(By element, int timeout)
{
    try {
        Console.WriteLine($" - Waiting for the element {element.ToString()}");
        int timesToWait = timeout * 4; // Times to wait for 1/4 of a second.
        int waitedTimes = 0; // Times waited.
        // This setup timesout at 7 seconds. you can change the code to pass the 

        do {
            waitedTimes++;
            if (waitedTimes >= timesToWait) {
                Console.WriteLine($" -- Element not found within (" +
                $"{(timesToWait * 0.25)} seconds). Canceling section...");
                return false;
            }
            Thread.Sleep(250);
        } while (!ExistsElement(element));

        Console.WriteLine($" -- Element found. Continuing...");
    //  Thread.Sleep(1000); // may apply here
        return true;
    } catch { throw; }
}
quot; - Waiting for the element {element.ToString()}"); int timesToWait = timeout * 4; // Times to wait for 1/4 of a second. int waitedTimes = 0; // Times waited. // This setup timesout at 7 seconds. you can change the code to pass the do { waitedTimes++; if (waitedTimes >= timesToWait) { Console.WriteLine(
/// <summary>
/// Waits until an element of the type <paramref name="element"/> to show in the screen.
/// </summary>
/// <param name="element">Element to be waited for.</param>
/// <param name="timeout">How long (in seconds) it should be waited for.</param>
/// <returns>
/// False: Never found the element. 
/// True: Element found.
/// </returns>
private bool WaitElement(By element, int timeout)
{
    try {
        Console.WriteLine($" - Waiting for the element {element.ToString()}");
        int timesToWait = timeout * 4; // Times to wait for 1/4 of a second.
        int waitedTimes = 0; // Times waited.
        // This setup timesout at 7 seconds. you can change the code to pass the 

        do {
            waitedTimes++;
            if (waitedTimes >= timesToWait) {
                Console.WriteLine($" -- Element not found within (" +
                $"{(timesToWait * 0.25)} seconds). Canceling section...");
                return false;
            }
            Thread.Sleep(250);
        } while (!ExistsElement(element));

        Console.WriteLine($" -- Element found. Continuing...");
    //  Thread.Sleep(1000); // may apply here
        return true;
    } catch { throw; }
}
quot; -- Element not found within (" +
/// <summary>
/// Waits until an element of the type <paramref name="element"/> to show in the screen.
/// </summary>
/// <param name="element">Element to be waited for.</param>
/// <param name="timeout">How long (in seconds) it should be waited for.</param>
/// <returns>
/// False: Never found the element. 
/// True: Element found.
/// </returns>
private bool WaitElement(By element, int timeout)
{
    try {
        Console.WriteLine($" - Waiting for the element {element.ToString()}");
        int timesToWait = timeout * 4; // Times to wait for 1/4 of a second.
        int waitedTimes = 0; // Times waited.
        // This setup timesout at 7 seconds. you can change the code to pass the 

        do {
            waitedTimes++;
            if (waitedTimes >= timesToWait) {
                Console.WriteLine($" -- Element not found within (" +
                $"{(timesToWait * 0.25)} seconds). Canceling section...");
                return false;
            }
            Thread.Sleep(250);
        } while (!ExistsElement(element));

        Console.WriteLine($" -- Element found. Continuing...");
    //  Thread.Sleep(1000); // may apply here
        return true;
    } catch { throw; }
}
quot;{(timesToWait * 0.25)} seconds). Canceling section..."); return false; } Thread.Sleep(250); } while (!ExistsElement(element)); Console.WriteLine(
/// <summary>
/// Waits until an element of the type <paramref name="element"/> to show in the screen.
/// </summary>
/// <param name="element">Element to be waited for.</param>
/// <param name="timeout">How long (in seconds) it should be waited for.</param>
/// <returns>
/// False: Never found the element. 
/// True: Element found.
/// </returns>
private bool WaitElement(By element, int timeout)
{
    try {
        Console.WriteLine($" - Waiting for the element {element.ToString()}");
        int timesToWait = timeout * 4; // Times to wait for 1/4 of a second.
        int waitedTimes = 0; // Times waited.
        // This setup timesout at 7 seconds. you can change the code to pass the 

        do {
            waitedTimes++;
            if (waitedTimes >= timesToWait) {
                Console.WriteLine($" -- Element not found within (" +
                $"{(timesToWait * 0.25)} seconds). Canceling section...");
                return false;
            }
            Thread.Sleep(250);
        } while (!ExistsElement(element));

        Console.WriteLine($" -- Element found. Continuing...");
    //  Thread.Sleep(1000); // may apply here
        return true;
    } catch { throw; }
}
quot; -- Element found. Continuing..."); // Thread.Sleep(1000); // may apply here return true; } catch { throw; } }

После этого вы можете играть сtimeout...

ДелатьBy вещи, которые вы заметили, которые загружаются последними на странице (например, элементы javascript и капчи), помня: это начнет работать// rest of your application до полной загрузки страницы, поэтому может быть неплохо поставитьThread.Sleep(1000) в конце просто чтобы быть уверенным ...

Также обратите внимание, что этот метод будет называться ПОСЛЕ 60-секундного стандартного тайм-аута от Selenium.DRIVER.Navigate().GoToUrl(url);

Не самый лучший, но ... как я уже сказал: хорошая Гамбиарра выполняет свою работу ...

По состоянию на 2018 год: Помимо этого:

driver.Manage().Timeouts().ImplicitWait.Add(System.TimeSpan.FromSeconds(5));      
driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(5));
driver.Manage().Timeouts().AsynchronousJavaScript.Add(timespan));

ждать поиска элемента, загрузки страницы и ожидания сценария соответственно. Есть:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

В случае, если это поможет любому, кто все еще ищет ответ, API C # WebDriver теперь содержит соответствующий метод.

driver.Manage().Timeouts().SetPageLoadTimeout(timespan)
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5);

Замечания:driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)) сейчас устарела.

Я нашел решение этой проблемы. При создании нового FirefoxDriver в конструкторе есть перегрузки, которые позволяют указать время ожидания команды, представляющее собой максимальное время ожидания каждой команды, и, похоже, оно работает при вызове метода GoToUrl ():

driver = new FirefoxDriver(new FirefoxBinary(), profile, new TimeSpan(0, 0, 0, timeoutSeconds));

ссылка на документацию конструктора FirefoxDriver для справки: http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/html/M_OpenQA_Selenium_Firefox_FirefoxDriver__ctor_2.htm

Надеюсь, что это помогает кому-то, кто сталкивается с этой проблемой.

Время ожидания загрузки страницы еще не реализовано в привязках .NET. Надеюсь, они скоро будут.

При этом вы сможете явно объявить ожидание.

WebDriverWait wait = new WebDriverWait(browser, new TimeSpan(time in seconds));
wait.until(Your condition)

Вы также можете изменить неявное время ожидания

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

Я думаю, что это синтаксис в C #. (не уверен)

В рубине это

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 30)

Ваш ответ на вопрос