Невозможно избежать ElementNotVisibleException, хотя я использую метод try и кроме - PullRequest
1 голос
/ 14 июня 2019

Я хочу скачать миллионы файлов Excel с веб-сайта, используя селен. Мой текущий код пытается обработать проблемы с ElementNotVisibleException, но мои методы «попробуй и исключи», похоже, не дотягивают.

Я попытался внедрить решение «попробуй и кроме», где, если появляется сообщение об ошибке, я дал указание Selenium ждать, пока не появится «кнопка».

import os
import time
import csv
from tqdm import tqdm
import pandas as pd
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
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.common.exceptions import ElementNotVisibleException
from selenium.common.exceptions import ElementClickInterceptedException

working_directory = r"xx"
os.chdir(working_directory)
options = webdriver.ChromeOptions() 

prefs = {
        "download.default_directory": r"xx",
       "download.prompt_for_download": False,
       "download.directory_upgrade": True}

options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(r"C:xxx\chromedriver.exe", options = options) 

driver.get("website")

# Login
driver.find_element_by_class_name("smallLoginBox").click()
driver.implicitly_wait(1)
time.sleep(2) 
driver.find_element_by_id('loginFormUC_loginEmailTextBox').send_keys('EMAIL')
driver.find_element_by_id('loginFormUC_loginPasswordTextBox').send_keys('PASWORD')
driver.find_element_by_xpath("//input[@value='Logg inn']").click()

# Get a custom list of firms
bedrifter  = []

with open("./listwithIDs.csv") as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for row in csvReader:
        bedrifter.append(row[0])

# THE LOOP

for ID in tqdm(bedrifter_gjenstår):
    driver.get("website" + ID)
    source = driver.page_source

    if not "Ingen data" in source: # make sure there is an excel file. If not, loop continues to next ID.
        # first click on button "download excel"
        try:
            driver.find_element_by_id("exportExcel").click()
        except ElementNotVisibleException:
            WebDriverWait(driver, 120).until(
                    EC.presence_of_element_located((By.ID, "exportExcel")))
            driver.find_element_by_id("exportExcel").click()
        except ElementClickInterceptedException:
            WebDriverWait(driver, 120).until(
                    EC.presence_of_element_located((By.ID, "exportExcel")))
            driver.find_element_by_id("exportExcel").click()

        # second click, choosing what format the excel file should be in
        try:
            driver.find_element_by_id("mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton").click()
        except ElementNotVisibleException:
            WebDriverWait(driver, 120).until(
                    EC.presence_of_element_located((By.ID, "mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton")))
            driver.find_element_by_id("mainContentPlaceHolder_mainContentPlaceHolder_mainContentPlaceHolder_AccountingNumberTableUc_excelLinkButton").click()

# code to switch between windows to remove download window and continue the code
        try: 
            window_export = driver.window_handles[1]
        except IndexError:
            time.sleep(3)
            print("sleep")
            window_export = driver.window_handles[1]

        try:
            window_main = driver.window_handles[0]
        except IndexError:
            time.sleep(3)
            print("sleep")
            window_main = driver.window_handles[0]

        driver.switch_to.window(window_export)
        driver.close()
        driver.switch_to.window(window_main)

Я ожидаю, что код загрузит все файлы, если они есть, но появится либо ElementNotVisibleException, либо ElementClickInterceptedException.

Ответы [ 3 ]

1 голос
/ 14 июня 2019

Чтобы убедиться, что элемент не только присутствует и видимый , но также кликабелен проверка на кликабельность в качестве условия ожидания:

element = WebDriverWait(driver, 120).until(EC.element_to_be_clickable((By.ID, "exportExcel"))).click()

Подробнее о ожиданиях Python можно найти здесь .

0 голосов
/ 15 июня 2019

Вы, вероятно, получаете эти исключения, потому что они встречаются внутри предложения except, а не внутри try.Пожалуйста, посмотрите на трассировку, чтобы определить, какая строка вызвала исключение.Это должно сказать вам, где проблема.Кроме того, если вы хотите подождать, пока элемент будет виден, вы должны использовать visibility_of_element_located вместо presence_of_element_located

0 голосов
/ 14 июня 2019

Перед выполнением любой операции с элементом сначала проверьте, виден он или нет. Вот пример кода:

wait = WebDriverWait(self.browser, 15)
wait.until(EC.visibility_of_element_located(("element_path")))
driver.find_element_by_xpath("element_path").click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...