python-3.x - Selenium Python没有定位元素
问题描述
我有一个 Selenium python 代码,我在内部动态 CRM 网站上运行以下载数据。在大多数情况下,代码一直工作到最后一步,它没有找到元素“导出数据”。导出数据出现在我们上一步触发的工具栏上的新功能区中。下面是代码和HTML。还附上了导出的 HTML 部分。我究竟做错了什么?如果您需要更多信息,请帮助并告诉我
屏幕 1 CRM 在单击时显示结果按钮将我们带到屏幕 2,它是工具栏上的一个新选项卡: 屏幕 2 带有工具栏上的新选项卡 导出 HTML 代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
from bs4 import BeautifulSoup
import requests
import pandas as pd
import os
from pathlib import Path
import shutil
#--| Chrome Setup
options = webdriver.ChromeOptions()
# options.add_argument("--headless")
options.add_argument('--disable-gpu')
options.add_argument('--log-level=3')
prefs={"download.default_directory":r"
#Setup Chrome preferences
options.add_experimental_option("prefs",prefs)
browser = webdriver.Chrome(chrome_options=options)
#Direct Link to NGL Five year Forecast Data Only
browser.get('<URL>')
browser.maximize_window()
# Store current window position
window_before = browser.window_handles[0]
wait = WebDriverWait(browser, 30)
#Key in Email
web_loginscreen = wait.until(EC.element_to_be_clickable((By.ID, 'i0116')))
web_loginscreen.send_keys("<UserName>")
# Next Button
web_loginbutton = browser.find_element_by_xpath('//*[@id="idSIButton9"]')
web_loginbutton.click()
window_before_title = browser.title
print(window_before_title)
#Filter button
web_filter = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="advancedFindLauncher"]/button/span/span')))
web_filter.click()
#browse to newly opened download window
browser.switch_to.window(browser.window_handles[1])
window_after = browser.window_handles[1]
window_after_title = browser.title
print(window_after_title)
# Select Agreements
time.sleep(5)
# locate all elements
frame = browser.find_element_by_xpath('//*[@id="contentIFrame0"]')
browser.switch_to.frame(frame)
#
dropdown = browser.find_element_by_xpath('//*[@id="slctPrimaryEntity"]')
dropdown.click()
agreements = browser.find_element_by_xpath('//*[@id="slctPrimaryEntity"]/option[35]')
agreements.click()
# print(dropdown.text)
# Go back out of iframe to default content
browser.switch_to.default_content()
# Look For Results
web_results = browser.find_element_by_xpath('//*[@id="apttusps.ApplicationRibbon.{!EntityLogicalName}.Button2.Button-Large"]')
web_results.click()
# ribbonframe = browser.find_element_by_id('apttus_apts_agreement|NoRelationship|SubGridStandard|Mscrm.SubGrid.apttus_apts_agreement.MainTab.ExportData')
# # browser.find_element_by_class_name('ms-cui-tabContainer ms-cui-tabContainer-lb')
# ribbonframe.click()
# browser.switch_to.frame(ribbonframe)
# Export to Excel
web_results_excel = browser.find_element_by_xpath('//*[@id="apttus_apts_agreement|NoRelationship|SubGridStandard|Mscrm.SubGrid.apttus_apts_agreement.ExportToExcel-Large"]')
# find_element_by_xpath('//*[@id="apttus_apts_agreement|NoRelationship|SubGridStandard|Mscrm.SubGrid.apttus_apts_agreement.ExportToExcel-Large"]')
web_results_excel.click()
time.sleep(15) #seconds
browser.close()
browser.quit()
解决方案
您可能只需要在代码中等待元素:
web_results = browser.find_element_by_xpath('//*[@id="apttusps.ApplicationRibbon.{!EntityLogicalName}.Button2.Button-Large"]')
web_results.click()
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "apttus_apts_agreement|NoRelationship|SubGridStandard|Mscrm.SubGrid.apttus_apts_agreement.MainTab.ExportData"))
)
# ribbonframe = browser.find_element_by_id('apttus_apts_agreement|NoRelationship|SubGridStandard|Mscrm.SubGrid.apttus_apts_agreement.MainTab.ExportData')
推荐阅读
- python - Python中的多元回归
- amazon-web-services - AWS Glue Crawlers - 如何处理可能仅包含字符串的大型 CSV 目录结构
- python-3.x - 提取最后 24 小时的日志并清理它们 python 3.x
- javascript - 无法让 Javascript 在 LAMP 服务器上运行
- reactjs - useReducer - 如何判断状态何时更新
- c++ - 是否有可以与 boost::uniform_int 相媲美的 Go 函数?
- excel - 写入 Excel 时无法打印背景颜色
- python - Python:迭代字典列表并输出到列表
- python - python 2.7中如何在没有for循环的情况下使用numpy数组的索引
- apache-spark - aws s3a 读取正常,但写入操作出错