首页 > 解决方案 > 即使我使用的是 try 和 except 方法,也无法避免 ElementNotVisibleException

问题描述

我想使用 selenium 从网站下载数百万个 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。

标签: pythonseleniumselenium-chromedriver

解决方案


为了确保元素不仅存在可见,而且还可以点击检查 clicability 作为等待条件:

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

更多关于 Python 等待的信息可以在这里找到。


推荐阅读