Я пытаюсь нажать кнопку. На данный момент я просто пытаюсь щелкнуть его один раз, и я знаю, что он будет там. Эта кнопка загружается с кучей других вещей с помощью 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 за помощь в продолжении моего проекта.
О, и это с GeckoDriver, какой бы ни была самая последняя стабильная версия.
Если вы используете Java, C# или Python, я бы, возможно, предложил вам нажать эту кнопку с помощью JavaScript, но, поскольку вы уже используете JS, я не знаю, есть ли здесь возможность использовать что-то вроде
JavascriptExecutor jse = (JavascriptExecutor)driver; jse.executeScript("document.getElementById('gbqfb').click();");
@Prophet почти уверен, что у меня есть исполнитель, позвольте мне попробовать это и вернуться к вам!
Флиппин сработал! Спасибо @Prophet, это мне очень помогает. Я все еще хотел бы понять, что происходит, поэтому я обновлю вопрос и оставлю его здесь, но щелчок через исполнителя работает для того, что мне нужно, так что спасибо!
Большой! Я хотел бы ответить на это нормально и дать некоторые пояснения, но я не знаю, как использовать executor с JS Selenium :)