selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не взаимодействует ошибка при попытке щелкнуть элемент с помощью Selenium Python - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь использовать Python Selenium для загрузки файла Excel, нажав «Экспорт в Excel» на этой странице:

https://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/Hang-Seng-Index-Futures-and-Options?sc_lang=en#&product=HSI

В режиме Chrome Inspect я думаю, что имя элемента - "ete"

<div class="ete title_right" id="ete">Export to Excel</div>

Вот мой код:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

options = Options()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")

driver = webdriver.Chrome('/usr/local/bin/chromedriver', chrome_options=options)

driver.get("https://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/Hang-Seng-Index-Futures-and-Options?sc_lang=en#&product=HSI")

driver.find_element_by_id('ete').click()

html = driver.page_source
print(html)
driver.close()

Тем не менее, при запуске моего кода возвращается исключение, не взаимодействующее с элементом:

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

[Обновления]

Я использовал метод Дебаняна, но возвращается TimeoutException:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_argument("--no-sandbox")
#options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome('/usr/local/bin/chromedriver', chrome_options=options)

driver.get('https://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/Hang-Seng-Index-Futures-and-Options?sc_lang=en#&product=HSI')
WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='textrow' and text()='FUTURES']//following::div[@class='ete title_right' and text()='Export to Excel']"))).click()

html = driver.page_source
print(html)
driver.close()
[root@mybox python-learning]# python3.6 web4.py
Traceback (most recent call last):
  File "web4.py", line 16, in <module>
    WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='textrow' and text()='FUTURES']//following::div[@class='ete title_right' and text()='Export to Excel']"))).click()
  File "/usr/lib/python3.6/site-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

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

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

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

При попытке click() в идеале вы должны вызвать WebDriverWait для желаемого элемента, который можно кликнуть .Кроме того, есть два (2) элемента с текстом Экспорт в Excel , и я рассмотрел элемент, который находится в верхней части страницы рядом с элементом с текстом, как FUTURES , и выможно использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument("--disable-extensions")
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('https://www.hkex.com.hk/Market-Data/Futures-and-Options-Prices/Equity-Index/Hang-Seng-Index-Futures-and-Options?sc_lang=en#&product=HSI')
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='textrow' and text()='FUTURES']//following::div[@class='ete title_right' and text()='Export to Excel']"))).click()
    
  • Снимок браузера:

download

0 голосов
/ 29 марта 2019

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

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

WebDriverWait(driver, 30).until(ec.visibility_of_element_located((By.CSS_SELECTOR, "#ete")))

После этого ожидания, когда элемент становится видимым, вы можете щелкнуть по нему.

Вот сайт с хорошей информацией об этом: http://allselenium.info/wait-for-elements-python-selenium-webdriver/

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