Подождите, пока элемент станет доступным для клика Selenium Javascript Bindings

avatar
Benjamin Peinhardt
8 августа 2021 в 17:59
168
0
0

Я пытаюсь нажать кнопку. На данный момент я просто пытаюсь щелкнуть его один раз, и я знаю, что он будет там. Эта кнопка загружается с кучей других вещей с помощью JavaScript, и поэтому требуется некоторое время, чтобы ее можно было нажать. На данный момент я пытаюсь щелкнуть по нему следующим образом:

const seeMoreBtn = await this.driver.findElement(showMoreBtnPath);
await waitUntilElementClickable(this.driver, seeMoreBtn, ONEMINUTE_TIMEOUT);
await seeMoreBtn.click();

Я написал функцию waitUntilElementClickable, так как не думаю, что она является частью привязки JavaScript. Он определяется следующим образом:

async function waitUntilElementClickable(driver, element, timeout) {
    await driver.wait(until.elementIsVisible(element), timeout);
    await driver.wait(until.elementIsEnabled(element), timeout);
}

Когда я запускаю свой код, я получаю сообщение об ошибке

(node:16076) UnhandledPromiseRejectionWarning: ElementClickInterceptedError: Element <button class="btn btn-default btn-sm ng-binding"> is not clickable at point (743,865) because another element <div class="clearfix animate-show ng-isolate-scope ng-hide-add ng-animate ng-hide-animate ng-hide ng-hide-add-active"> obscures it

Я не могу прикрепить снимок экрана из-за информации на странице, но драйвер автоматически прокручивает элемент, а ONEMINUTE_TIMEOUT не ожидает, поэтому я предполагаю, что элемент виден и включен.

Были бы очень полезны любые советы о том, почему этот клик все еще перехватывается. Спасибо! Кроме того, я знаю, что функция waitUntilElementClickable теоретически может удвоить время ожидания, просто на данный момент это не имеет большого значения.

Обновление: быстрое исправление, предложенное @Prophet в комментариях, работает для меня. Я заменил

await seeMoreBtn.click();

с

await this.driver.executeScript("arguments[0].click()", seeMoreBtn);

Большое спасибо @Prophet за помощь в продолжении моего проекта.

Источник
Benjamin Peinhardt
8 августа 2021 в 18:01
0

О, и это с GeckoDriver, какой бы ни была самая последняя стабильная версия.

Prophet
8 августа 2021 в 18:09
0

Если вы используете Java, C# или Python, я бы, возможно, предложил вам нажать эту кнопку с помощью JavaScript, но, поскольку вы уже используете JS, я не знаю, есть ли здесь возможность использовать что-то вроде JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("document.getElementById('gbqfb').click();");

Benjamin Peinhardt
8 августа 2021 в 18:12
1

@Prophet почти уверен, что у меня есть исполнитель, позвольте мне попробовать это и вернуться к вам!

Benjamin Peinhardt
8 августа 2021 в 19:18
0

Флиппин сработал! Спасибо @Prophet, это мне очень помогает. Я все еще хотел бы понять, что происходит, поэтому я обновлю вопрос и оставлю его здесь, но щелчок через исполнителя работает для того, что мне нужно, так что спасибо!

Prophet
8 августа 2021 в 19:20
0

Большой! Я хотел бы ответить на это нормально и дать некоторые пояснения, но я не знаю, как использовать executor с JS Selenium :)

Ответы (0)