Question php-webdriver: attendez la réponse du navigateur après avoir envoyé le formulaire en cliquant ()


En dehors de l'utilisation sleep() Dans mon test, je me demande si quelqu'un connaît une meilleure stratégie pour attendre explicitement la fin d'une soumission de formulaire (POST) avant de poursuivre mes assertions. Voici une version très condensée de ce à quoi ressemble mon test, en utilisant phpunit ensemble php-webdriver de Facebook).

function test_form_submission()
{   
    // setup
    $web_driver = new WebDriver();
    $session = $web_driver->session();
    $session->open('http://example.com/login');

    // enter data
    $session->element('css selector', 'input[name=email]')->value(array('value' => str_split('test@example.com')));
    $session->element('css selector', 'input[name=password]')->value(array('value' => str_split('testpassword')));

    // click button to submit form
    $session->element('css selector', 'button[name=submit]')->click();

    // How do I wait here until the click() above submits the form
    // so I can check that we correctly arrives at the destination below
    // without resorting to sleep()?

    // Confirm that login was successful because we landed on account page
    $this->assertSame('http://example.com/account', $session->url());

    // teardown
    $session->close();
}

10
2018-01-22 19:59


origine


Réponses:


php-webdriver de Facebook a été réécrit en juin 2013. Vous pouvez attendre facilement l'URL comme ceci.

// wait for at most 10 seconds until the URL is 'http://example.com/account'.
// check again 500ms after the previous attempt.
$driver->wait(10, 500)->until(function ($driver) {
  return $driver->getCurrentURL() === 'http://example.com/account';
})

19
2017-08-14 23:01



Ok, donc je sais que c'est une très vieille question, mais comme je suis tombé dessus par Google, j'espère que cela peut encore être utile pour quelqu'un (peut-être même l'OP? :-)).

Après quelques recherches et lectures d'articles et de messages sur Google Code, j'ai trouvé une solution qui me semble assez moche, mais il n'y a pas vraiment de bonne alternative. Tu peux lire ici qu'il est impossible pour WebDriver de détecter le chargement de la page. Donc, nous devons revenir à l'attente. Maintenant, l'OP utilise PHP WebDriver de Facebook, qui n'inclut pas les utilitaires en attente AFAIK, mais en utilisant ce clone maintenu, vous obtenez une implémentation de WebDriverWait.

Maintenant, la question est: qu'est-ce que nous attendons? Vous pouvez attendre que l'URL change, mais ce n'est en aucun cas une approche fiable, car la page n'est probablement pas encore chargée lorsque l'URL a déjà été modifiée. Option suivante: attendez qu'un élément sur la page soit chargé pour apparaître. Ça va marcher, mais si vous voulez avoir une approche plus générique? Heureusement, j'ai lu une très bonne idée dans le fil J'ai mentionné ci-dessus Vous pouvez attendre qu'un élément figurant sur les deux pages disparaisse et le réapparaisse, par exemple le pied de page.

Je l'ai implémenté tout à l'heure et cela semble fonctionner. La fonction ci-dessous peut être passé votre $session et ne reviendra que lorsque la nouvelle page est chargée (ou du moins, le pied de page est à nouveau disponible).

public static function waitForNextPage($pWDSession) {
    $aWait = new PHPWebDriver_WebDriverWait($pWDSession);
    // wait for footer to not be available anymore
    $aWait->until(
            function($pWDSession) {
                return (0 === count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer")));
            }
        );
    // wait for footer to be available again
    $aWait->until(
            function($pWDSession) {
                return (0 < count($pWDSession->elements(PHPWebDriver_WebDriverBy::CSS_SELECTOR, "#footer,#mx-footer")));
            }
        );
}

Vous pouvez évidemment changer de sélecteur ou utiliser un autre élément, l'idée reste la même.

J'espère que ça aide! À votre santé!


2
2017-07-31 12:27



Vous pouvez utiliser Implicit Wait and Explicit Wait attendre un élément Web particulier jusqu'à ce qu'il apparaisse dans la page. La période d'attente que vous pouvez définir dépend de l'application.

Attente explicite:

Une attente explicite est un code que vous définissez pour attendre qu'une certaine condition se produise avant de continuer dans le code. Si la condition est atteinte, le processus sera terminé et les étapes suivantes se dérouleront.

Code:

 WebDriverWait wait = new WebDriverWait(driver,30);
 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(strEdit)));

Ou

 WebElement myDynamicElement = (new WebDriverWait(driver, 30))
 .until(new ExpectedCondition<WebElement>(){
@Override
public WebElement apply(WebDriver d) {
    return d.findElement(By.id("myDynamicElement"));
}});

Cela attend jusqu'à 30 secondes avant de lancer une TimeoutException ou si l'élément détecte que l'élément le renverra dans 0 à 30 secondes. WebDriverWait appelle par défaut la classe ExpectedCondition toutes les 500 millisecondes jusqu'à ce qu'il soit renvoyé avec succès. Un retour réussi est pour le type ExpectedCondition si Boolean renvoie la valeur de retour true ou not null pour tous les autres types ExpectedCondition.

Vous pouvez utiliser la classe ExpectedConditions selon vos besoins pour l'application.

Attente implicite:

Une attente implicite consiste à demander à WebDriver d'interroger le DOM pendant un certain temps lorsqu'il essaie de trouver un élément ou des éléments s'ils ne sont pas immédiatement disponibles.

Code:

 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Une chose à garder à l'esprit est qu'une fois l'attente implicite définie, elle restera en vie pendant l'instance de l'objet WebDriver.

Pour plus d'infos utilisez ce lien http://seleniumhq.org/docs/04_webdriver_advanced.jsp


1
2018-01-23 04:09



Au lieu de click() il devrait être possible d'utiliser clickAndWait(), afin d'attendre le chargement de la page suivante.


0
2018-01-22 20:38