python - 即使我使用的是 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。
解决方案
为了确保元素不仅存在且可见,而且还可以点击检查 clicability 作为等待条件:
element = WebDriverWait(driver, 120).until(EC.element_to_be_clickable((By.ID, "exportExcel"))).click()
更多关于 Python 等待的信息可以在这里找到。
推荐阅读
- android - 包含自定义形状的 ShapeDrawable 的 setTint?
- ios - 一旦我不允许它,我可以得到通知令牌然后从设置中允许它。(所有无需重新启动应用程序)
- angular - 在 NGXS Angular 中使用大写或小写进行过滤
- mongodb - 当使用带有 CountDocument 的提示时,MongoDB golang 驱动程序不返回无法识别的字段“提示”
- python - 使用 BeautifulSoup 检查列表中的字符串是否存在于 HTML 中
- reactjs - 在 onChange 类中呈现的 OptGroup
- python - SQLAlchemy:如何在更新语句中使用变量
- cypher - Redis Graph:合并现有节点
- android - 尝试在游标适配器中获取空数组的长度
- java - 说明 Android Activity onPause 和 onRestart