Как ждать в Selenium WebDriver, когда WebDriverWait или неявное ожидание не будет - PullRequest
0 голосов
/ 24 мая 2018

Я использую Selenium и сталкиваюсь со следующей проблемой:

По сути, на странице есть всплывающее окно, которое появляется после нажатия кнопки на странице.Я хочу отклонить всплывающее окно.Для этого я нажимаю на значок x в правом верхнем углу.Я могу правильно идентифицировать элемент и щелкнуть по нему с помощью XPath (я знаю, что XPath верный, потому что он работает в Firebug, и Selenium не выдает никаких исключений при использовании XPath, поэтому элемент должен присутствовать. Кроме того, оба isDisplayed()и isEnabled() вернет истину).Самое смешное, что после этого всплывающее окно не исчезает.Однако, если я добавлю 3-секундную задержку (до закрытия всплывающего окна), всплывающее окно исчезнет.Моя проблема в том, что я не хочу задерживать выполнение программы больше, чем необходимо, поэтому я бы предпочел использовать максимальную задержку в 3-5 секунд, но если всплывающее окно готово к взаимодействию (то есть, отклонено), я хочу отклонитьэто как можно скорее.

Я думал об использовании чего-то вроде:

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

Но это не работает, поскольку заявлено, что драйвер обнаруживает веб-элемент как присутствующий (и видимый и отображаемый) немедленно, но щелчок не будет работать, если я не подожду 3 секунды.

Аналогично, я не могу использовать:

    WebDriverWait wait = new WebDriverWait(driver, 30, 5000);

    wait.until(ExpectedConditions.elementToBeClickable(element));

по той же причине (это будет работать, только если указанный элемент не былкликабельный / видимый до 3 секунд, но что касается WebDriver - он виден сразу)

Может кто-нибудь помочь мне понять, почему, несмотря на наличие элемента факта, клик не удался и как я могу сделатьэто так, что Selenium щелкает, как только щелчок будет успешным, не дожидаясь полных 3-5 секунд.

HTML:

  <div class="a-popover-wrapper">
    <div class="a-popover-header">
    <button class=" a-button-close a-declarative" aria-label="Close" data-action="a-popover-close">
    <i class="a-icon a-icon-close"/>
    </button>
    <h4 id="a-popover-header-7" class="a-popover-header-content">Buy professional installation</h4>
    </div>
    <div id="a-popover-content-7" class="a-popover-inner pdp-service-modal-instance" style="height: auto; overflow-y: auto;">
    </div>
    <span class="a-popover-end a-popover-a11y-offscreen" tabindex="0"/>
  </div>

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

driver.switchTo().alert().accept();
0 голосов
/ 24 мая 2018

Вы пробовали использовать FluentWait ?Попробуйте приведенный ниже код,

Wait<WebDriver> wait = new FluentWait<WebDriver>(pDriver).withTimeout(100, TimeUnit.SECONDS).pollingEvery(600,TimeUnit.MILLISECONDS).ignoring(NoSuchElementException.class);
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("selector"));

. Вы можете использовать приведенный выше или приведенный ниже случай,

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("selector")));

. Для получения дополнительной информации о FluentWait , перейдите по этой ссылке.https://sqa.stackexchange.com/questions/12866/how-fluentwait-is-different-from-webdriverwait

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...