Элемент, идентифицированный с помощью find_element_by_xpath, возвращает selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не виден - PullRequest
0 голосов
/ 04 мая 2018

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

try:
    element= driver.find_element_by_xpath("//button[@class='butwb']")
    if element.is_displayed():       
        print ("Element found")
    else:
        print ("Element not found")
except NoSuchElementException:
    print("No element found") 

Результат:

Element not found

Если я добавлю element.click():

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

Что я делаю не так?

Ответы [ 2 ]

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

Поговорив с Кунсиосо и войдя в игру, мы обнаружили, что есть две кнопки, которые соответствуют его локатору, а первая скрыта. Проблема была решена с помощью кода ниже, чтобы нажать вторую кнопку, ту, которую он хотел.

driver.find_elements_by_xpath("//button[@class='butwb']")[1].click()
0 голосов
/ 05 мая 2018

Это сообщение об ошибке ...

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

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

Следующая строка кода для идентификации элемента была успешной , поскольку элемент присутствовал в HTML DOM :

element= driver.find_element_by_xpath("//button[@class='butwb']")

Здесь стоит упомянуть, что наличие элемента означает, что элемент присутствует в DOM страницы. Это не гарантирует, что элемент является видимым (то есть отображаемым) или интерактивным (то есть интерактивным) .

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

Следовательно, is_displayed() метод возвращает false и выполняется блок else{}, который печатает:

Element not found

Далее при вызове click() возникает следующее исключение:

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

Возможные причины

  • Принятая вами стратегия Locator не может идентифицировать элемент, поскольку он отсутствует в браузере Viewport .

  • Стратегия Locator , которую вы приняли, не уникально идентифицирует нужный элемент в HTML DOM и в настоящее время находит некоторые другие скрытый / невидимый элемент.

  • Принятая вами стратегия Locator идентифицирует элемент, но невидим из-за наличия атрибута style = "display: none;" .

  • WebElement может присутствовать в Модальное диалоговое окно и может не отображаться / взаимодействовать немедленно.

* Решения 1088 * Используйте execute_script() метод для прокрутки элемента, чтобы просмотреть следующим образом: elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].scrollIntoView();", elem); Здесь вы найдете подробное обсуждение Прокрутка до верхней части страницы в Python с использованием Selenium Использование принятой вами стратегии Locator не однозначно идентифицирует нужный элемент в HTML DOM и в настоящее время находит некоторые другие скрытые / невидимые Элемент в качестве первого совпадения должен изменить стратегию Locator . Элемент Incase имеет атрибут style = "display: none;" , удалите атрибут с помощью метода executeScript() следующим образом: elem = driver.find_element_by_xpath("element_xpath") driver.execute_script("arguments[0].removeAttribute('style')", elem) elem.send_keys("text_to_send"); Если элемент не присутствует / видим / интерактивно в HTML DOM немедленно, вызвать WebDriverWait с Ожидаемые_условия , установленный на правильный метод следующим образом: Ожидать sence_of_element_located : element = WebDriverWait(driver, 20).until(expected_conditions.presence_of_element_located((By.XPATH, "element_xpath']"))) В ожидании visibility_of_element_located : element = WebDriverWait(driver, 20).until(expected_conditions.visibility_of_element_located((By.CSS_SELECTOR, "element_css") В ожидании element_to_be_clickable : element = WebDriverWait(driver, 20).until(expected_conditions.element_to_be_clickable((By.LINK_TEXT, "element_link_text")))

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