From fba2a862a3085efc79340b4f9c29908b9926a160 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Mon, 10 Aug 2020 11:59:58 +0200 Subject: [PATCH] Bug 26162: Wait for the table to be refreshed The previous patch did not work as expected. We still got a StaleElementReference exception. But this time on 10:43:47 selenium_1 | Caused by: org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"xpath","selector":"//*[@id=\"branchname\"]"} Because we found the one that existed on the page, not the one sent back in AJAX. The idea of this patch is to search for the "Showing 1 to X of Y entries" info and wait for X == Y Signed-off-by: Jonathan Druart (cherry picked from commit 70ff3bafa05a30944962747953c70bb8dc3c1ab8) Signed-off-by: Lucas Gass (cherry picked from commit ce8a819b5fb77a8df59f131b4af96e24106bd32e) Signed-off-by: Aleisha Amohia (cherry picked from commit 0a127a78e9de3771b8418b123eed6815f2745304) Signed-off-by: Victor Grousset/tuxayo --- t/lib/Selenium.pm | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/t/lib/Selenium.pm b/t/lib/Selenium.pm index a9c6ed315f..7cf5ad26a6 100644 --- a/t/lib/Selenium.pm +++ b/t/lib/Selenium.pm @@ -166,15 +166,44 @@ sub click { $self->click_when_visible( $xpath_selector ); } -sub click_when_visible { +sub wait_for_element_visible { my ( $self, $xpath_selector ) = @_; + $self->driver->set_implicit_wait_timeout(20000); my ($visible, $elt); + $self->remove_error_handler; while ( not $visible ) { $elt = eval {$self->driver->find_element($xpath_selector) }; $visible = $elt && $elt->is_displayed; $self->driver->pause(1000) unless $visible; } + $self->add_error_handler; + return $elt; +} + +sub show_all_entries { + my ( $self, $xpath_selector ) = @_; + + $self->driver->find_element( $xpath_selector + . '//div[@class="dataTables_length"]/label/select/option[@value="-1"]' + )->click; + my ($all_displayed); + while ( not $all_displayed ) { + my $dt_infos = $self->driver->get_text( + $xpath_selector . '//div[@class="dataTables_info"]' ); + + if ( $dt_infos =~ m|Showing 1 to (\d+) of (\d+) entries| ) { + $all_displayed = 1 if $1 == $2; + } + + $self->driver->pause(1000) unless $all_displayed; + } +} + +sub click_when_visible { + my ( $self, $xpath_selector ) = @_; + + my $elt = $self->wait_for_element_visible( $xpath_selector ); my $clicked; $self->remove_error_handler; -- 2.39.5