Как заставить Selenium WebDriver нажать на элемент, который в данный момент не виден? - PullRequest
95 голосов
/ 23 мая 2011

Я использую Selenium 2 Java API с FirefoxDriver. Когда я заполняю форму, флажки добавляются на страницу в зависимости от ввода формы.

Я бы хотел смоделировать щелчок по этим флажкам с помощью Selenium. Элемент видим и доступен в обычном браузере, но Селен утверждает, что элементы не видны.

"Element is not currently visible and so may not be interacted with"

Можно ли заставить селен игнорировать невидимое состояние элементов? Как заставить Selenium взаимодействовать с невидимым элементом?

Ответы [ 14 ]

1 голос
/ 01 декабря 2011

Я просто решаю эту ошибку при использовании капибары в проекте ror, добавив:

Capybara.ignore_elements = true

до features/support/env.rb.

0 голосов
/ 01 июля 2019

На этой странице много хороших ответов.

  1. Обычно я начинаю с maximize.window (), на самом деле я делаю это в Фабрика драйверов или где вы инициализируете свой драйвер. Это делается по умолчанию - всегда.
  2. Обычно это элемент ожидания из-за некоторой задержки JavaScript.

Оба обсуждаются в различных деталях выше. Ответ, который я не видел, был ScrollToElement. Похоже, вы обрабатываете список элементов, а при обработке вы создаете больше элементов, флажки. Это может привести к тому, что элементы в вашем списке переместятся с видимой страницы. Иногда вы можете увидеть элемент невооруженным глазом, но просто не можете нажать на него. При обработке списков иногда приходится прерывать прокрутку.

  • Установите точку останова и проверьте, находится ли используемый элемент на край окна, верхний / нижний правый / левый. Иногда, когда это Если вы не можете добраться до него через селен, но вы можете вручную нажать твоя мышь.

Поскольку я столкнулся с этим, я создал PageScroll.java и поместил свои скрипты прокрутки туда. Вот несколько методов из этого класса:

public static void scrollToTop(WebDriver driver) {
      ((JavascriptExecutor) driver)
        .executeScript("window.scrollTo(0,0)");
    }

    public static void scrollToBottom(WebDriver driver) {
      ((JavascriptExecutor) driver)
        .executeScript("window.scrollTo(0, document.body.scrollHeight)");
    }

    public static void scrollToElementTop(WebDriver driver, WebElement element) {
      ((JavascriptExecutor) driver).executeScript(
        "arguments[0].scrollIntoView(true);", element);
    }

    public static void scrollToElementBottom(WebDriver driver, WebElement element) {
      ((JavascriptExecutor) driver).executeScript(
        "arguments[0].scrollIntoView(false);", element);
    }

см. Прокрутить элемент в поле зрения с помощью Selenium для дополнительных примеров

0 голосов
/ 14 ноября 2018

Чтобы добавить здесь мою песчинку: если элемент находится за фиксированным тегом div, он будет считаться невидимым, и вы не сможете щелкнуть по нему;это случилось со мной недавно, и я решил это, выполнив скрипт, как рекомендовано выше, который делает:

document.evaluate("<xpath locator for element to be clicked>", document, null, XPathResult.ANY_TYPE, null).iterateNext().click()", locator);
0 голосов
/ 18 октября 2017

Принятый ответ сработал для меня. Ниже приведен код для поиска родительского элемента, который заставляет Selenium думать, что его не видно.

function getStyles(element){
	
	computedStyle = window.getComputedStyle(element);

	if(computedStyle.opacity === 0
	|| computedStyle.display === "none"
	|| computedStyle.visibility === "hidden"
	|| (computedStyle.height < 0 && computedStyle.height < 0)
	|| element.type === "hidden") {
		console.log("Found an element that Selenium will consider to not be visible")
		console.log(element);
		console.log("opacity: " + computedStyle.opacity);
		console.log("display: " + computedStyle.display);
		console.log("visibility: " + computedStyle.visibility);
		console.log("height: " + computedStyle.height);
		console.log("width: " + computedStyle.width);
	}

	if(element.parentElement){
		getStyles(element.parentElement);
	}
}

getStyles(document.getElementById('REPLACE WITH THE ID OF THE ELEMENT YOU THINK IS VISIBLE BUT SELENIUM CAN NOT FIND'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...