Python 即使在等待DOM更新之后,Selenium也找不到HTML中存在的元素
我正试图在一个网站上搜集信息,而这些信息并没有立即出现。当您单击某个按钮时,页面开始在页面底部加载新内容,加载完成后,红色文本显示为“辅助(至少)”。我能够找到第一个按钮“转到道具生成器”,该按钮不会立即显示在页面上,但在脚本单击该按钮后,当试图查找“辅助(至少)”文本时,它会超时,尽管脚本处于休眠状态并且出现在屏幕上Python 即使在等待DOM更新之后,Selenium也找不到HTML中存在的元素,python,selenium,selenium-webdriver,webdriverwait,Python,Selenium,Selenium Webdriver,Webdriverwait,我正试图在一个网站上搜集信息,而这些信息并没有立即出现。当您单击某个按钮时,页面开始在页面底部加载新内容,加载完成后,红色文本显示为“辅助(至少)”。我能够找到第一个按钮“转到道具生成器”,该按钮不会立即显示在页面上,但在脚本单击该按钮后,当试图查找“辅助(至少)”文本时,它会超时,尽管脚本处于休眠状态并且出现在屏幕上 from selenium import webdriver from selenium.webdriver.support import expected_conditions
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
import time
from bs4 import BeautifulSoup
driver = webdriver.Chrome()
driver.get('https://www.bovada.lv/sports/basketball/nba')
# this part succeeds
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(
(By.XPATH, "//span[text()='Go to Prop builder']")
)
)
element.click()
time.sleep(5)
# this part fails
element2 = WebDriverWait(driver, 6).until(
EC.visibility_of_element_located(
(By.XPATH, "//*[text()='Assists (At Least)']")
)
)
time.sleep(2)
innerHTML = driver.execute_script('return document.body.innerHTML')
driver.quit()
soup = BeautifulSoup(innerHTML, 'html.parser')
圆括号是这里的问题(至少在某些情况下…)。如果可能,请使用.contains选择器:
/*[contains(text(),'Assists')和contains(text(),'Least')]
增加超时以确认提供的超时是否正确,您也可以使用调试模式进行确认。如果问题仍然存在,请检查“辅助(至少)”元素是否不在任何框架下
如果问题未解决,您还可以共享DOM和正确的错误消息。我有一些建议,您可以尝试
- 确保加载在底部的内容不在框架中。如果是,则需要切换到特定帧
- 检查XPath是否正确,从开发人员控制台尝试XPath是否匹配
从浏览器中检查元素,打开开发人员控制台后,按CTRL+F,然后尝试XPath。如果未高亮显示检查框架,则问题在于辅助元件位于框架下。您需要像这样切换到帧:
frame = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME,"player-props-frame")))
driver.switch_to.frame(frame)
iframe=driver.find_element_by_css_selector('iframe[class="player-props-frame"]')
driver.switch_to.frame(iframe)
您想要的内容位于iFrame中。您可以通过先切换到它来访问它,如下所示:
frame = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME,"player-props-frame")))
driver.switch_to.frame(frame)
iframe=driver.find_element_by_css_selector('iframe[class="player-props-frame"]')
driver.switch_to.frame(iframe)
我试过了,但还是出现了超时异常。还有一个类似的元素显示为文本“FAQ”,它没有圆括号,我尝试用它来搜索,而不是“Assists(至少)”,但也出现了超时异常