Подтвердить что ты не робот

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

Я использую Selenium 2.20 WebDriver для создания и управления браузером firefox с С#. Чтобы посетить страницу, я использую следующий код, устанавливая время ожидания драйвера перед посещением 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

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

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

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

4b9b3361

Ответ 1

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

driver.Manage().Timeouts().SetPageLoadTimeout(timespan)

Ответ 2

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

Примечание: driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)) теперь устарел.

Ответ 3

Я нашел решение этой проблемы. При создании нового 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

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

Ответ 4

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

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

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

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

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

В рубине

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

Ответ 5

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

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

Что WaitElement(By, int) мой 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($" - 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; }
}

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

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

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

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

Ответ 6

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

Ответ 7

По состоянию на 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));

Ответ 8

driver.Manage().Timeouts().SetPageLoadTimeout(timespan) 

не работает.

Это работает. Используйте синтаксис установки свойств.

driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(15);