Selenium WebDriver - comment configurer le temps de chargement d'une Page en utilisant C#

J'utilise Selenium 2.20 WebDriver pour créer et gérer un navigateur firefox avec C#. Pour visiter une page, j'utilise le code suivant, paramétrant le driver timeouts avant de visiter L'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

le problème est que parfois les pages prennent une éternité à charger, et il apparaît que le délai par défaut pour une page à charger en utilisant le WebDriver de sélénium est de 30 secondes, ce qui est trop long. Et je ne crois pas que les délais que je fixe s'appliquent au chargement d'une page en utilisant le GoToUrl() méthode.

donc j'essaye de trouver comment définir un délai pour qu'une page se charge, cependant, je ne trouve aucune propriété ou méthode qui fonctionne réellement. Le délai par défaut de 30 secondes semble aussi s'appliquer lorsque je clique sur un élément.

y a-t-il un moyen de définir le délai de chargement de la page à une valeur spécifique de sorte que lorsque j'appelle la méthode GoToUrl() elle n'attendra que mon temps spécifié avant de continuer?

26
demandé sur Nakilon 2012-05-15 22:29:59

7 réponses

si cela aide quelqu'un qui cherche encore la réponse à cette question, L'API C# WebDriver contient maintenant la méthode appropriée.

driver.Manage().Timeouts().SetPageLoadTimeout(timespan)
29
répondu ktam33 2018-03-23 16:19:39
driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(5);

Remarque: driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)) est maintenant obsolète.

17
répondu Josh 2017-06-21 20:46:37

Avec ceci, vous devriez être en mesure de déclarer une attente explicite.

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

vous pouvez aussi changer le temps d'attente implicite

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

je pense que c'est la syntaxe en C#. (pas sûr)

En ruby, il est

@driver.manage.timeouts.implicit_wait = 30
@wait = Selenium::WebDriver::Wait.new(:timeout => 30)
3
répondu Amey 2012-05-15 18:50:57

j'ai trouvé la solution à ce problème. Lors de la création d'un nouveau FirefoxDriver, il y a des surcharges dans le constructeur qui vous permettent de spécifier une commande timeout qui est le temps maximum d'attente pour chaque commande, et cela semble fonctionner lorsque vous appelez la méthode GoToUrl ():

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

lien vers la documentation du constructeur de FirefoxDriver pour référence: http://selenium.googlecode.com/svn/trunk/docs/api/dotnet/html/M_OpenQA_Selenium_Firefox_FirefoxDriver__ctor_2.htm

Espérons que cela aide quelqu'un d'autre qui s'exécute ce problème.

3
répondu KabanaSoft 2012-05-17 16:07:01

les timeouts de chargement de Page ne sont pas encore implémentés dans les fixations .NET. J'espère qu'ils seront bientôt.

0
répondu JimEvans 2012-05-15 19:40:37

à partir de 2018: En plus de ces:

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

attendre la recherche d'un élément, le chargement d'une page, et attendre le script respectivement. Il y a:

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
0
répondu Ywapom 2018-05-16 21:06:03

nous, les Brésiliens, avons un mot pour "gambiarra"... Bien... au moins ils faire le travail... Voici la mienne:

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

Ce que mon 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; }
}

Après cela, vous pouvez jouer avec timeout...

By les choses que vous remarquez qui se chargent dernier dans la page (comme les éléments javascript et captchas) en se rappelant: il va commencer à travailler le // rest of your application avant que la page se charge complètement, donc peut être agréable de mettre un Thread.Sleep(1000) à la fin pour en être sûr...

notez aussi que cette méthode sera appelée après le délai standard de 60 secondes deDRIVER.Navigate().GoToUrl(url);

ce n'est Pas le meilleur, mais... comme je l'ai dit: une bonne gambiarra fait son travail...

0
répondu Marko Marchiori 2018-09-25 17:25:25