python - Selenium 无法定位动态元素
问题描述
我试图通过搜索 xpath、outerhtml、扩展 xpath、css 选择器、类名等来在屏幕截图中找到这个元素。我正在自动化一个程序以从网站下载 pdf,但由于某种原因,我需要单击以下载它的元素是动态元素。这是我的代码(我已审查敏感信息):
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
username = "***"
password = '***'
driver = webdriver.Chrome()
def info_fill():
driver.get ('***')
driver.find_element_by_xpath('//*[@id="fsLoginUsernameField1249"]').send_keys(username)
driver.find_element_by_xpath ('//*[@id="fsLoginPasswordField1249"]').send_keys(password)
def login():
driver.find_element_by_xpath('//*[@id="fsEl_1249"]/div/div[1]/form/input[5]').click()
def portal():
time.sleep(4)
driver.get('***')
def get_grade_doc():
time.sleep(4)
driver.find_element_by_xpath('//*[@id="navigation-top"]/ic-sidebar/div/ic-tool-list/nav/ul/li[5]/a').click()
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "/html/body/iframe[@id='xh-bar']"))
)
finally:
driver.find_element_by_xpath("/html/body/iframe[@id='xh-bar']").click()
info_fill()
login()
portal()
get_grade_doc()
driver.quit()
这是网络检查器的屏幕截图。我要定位的元素被突出显示。
<li _ngcontent-pts-c11="" class="divider__content documents__row clickable
flex--space-between" role="link" tabindex="0"><div _ngcontent-pts-c11=""
class="pr-4 float-left"><div _ngcontent-pts-c11="">Gradebook Detail -
November 2020</div><!----><!----><!----><!----><div _ngcontent-pts-c11=""
class="text-secondary pt-1"> </div><!----><div _ngcontent-pts-c11=""
class="text-secondary pt-1"> 20-21 Upper<!----></div><!----><!----></div><div
_ngcontent-pts-c11="" class="hide-tiny float-right"><!----><i _ngcontent-pts-
c11="" class="fa fa-chevron-right fa-light float-right"></i></div><i
_ngcontent-
pts-c11="" class="fa fa-chevron-right fa-light float-right hide-until-tiny">
</i></li>
解决方案
您的元素位于 iframe 中。这个问题之前已经回答过很多次了。 通过 Selenium 和 python 切换到 iframe
# driver.switch_to.frame(‘frame_id’)
driver.switch_to.frame("xh-bar")
或这个:
iframe = driver.find_element_by_xpath("//html/body/iframe[@id='xh-bar']")
driver.switch_to.frame(iframe)