首页 > 解决方案 > 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()

标签: python-3.xselenium

解决方案


您可能只需要在代码中等待元素:

    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')

推荐阅读