Selenium 在等待 DOM 更新后仍未在 HTML 中找到元素
Selenium Not Finding Element Present in HTML Even After Waiting for DOM to update
我正在尝试在信息未立即显示的网站上抓取信息。当你点击某个按钮时,页面开始在页面底部加载新内容,加载完成后,红色文本显示为“Assists (At Least)”。我能够找到第一个按钮“Go to Prop builder”,它不会立即显示在页面上,但是在脚本单击该按钮后,它在尝试查找“Assists (At Least)”文本时超时,尽管脚本正在休眠并出现在屏幕上。
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 ') and contains(text(),'At Least')]
增加超时时间以确认提供的超时时间是否正确,您也可以使用调试模式进行确认。如果问题仍然存在,请检查“助攻(至少)”元素不属于任何框架。
如果问题未解决,您还可以分享 DOM 和正确的错误消息。
我有几个建议你可以试试,
- 确保底部加载的内容不在框架中。如果是,则需要切换到特定帧
- 检查 XPath 是否正确,尝试从 Developer Console 匹配 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,在查看页面源中搜索iframe,如果找到您要查找的那个字段,则先切换到那个框架。
driver.switch_to.frame("iframe 的名称")
- 尝试在页面上添加超时重试逻辑和刷新按钮(如果有)
st = time.time()
而 st+180>time.time():
尝试:
element2 = WebDriverWait(driver, 6).until(
EC.visibility_of_element_located(
(By.XPATH, "//*[text()='Assists (At Least)']")
)
)
除了:
通过
您需要的内容在 iFrame 中。您可以先切换到它来访问它,如下所示:
iframe=driver.find_element_by_css_selector('iframe[class="player-props-frame"]')
driver.switch_to.frame(iframe)
我正在尝试在信息未立即显示的网站上抓取信息。当你点击某个按钮时,页面开始在页面底部加载新内容,加载完成后,红色文本显示为“Assists (At Least)”。我能够找到第一个按钮“Go to Prop builder”,它不会立即显示在页面上,但是在脚本单击该按钮后,它在尝试查找“Assists (At Least)”文本时超时,尽管脚本正在休眠并出现在屏幕上。
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 ') and contains(text(),'At Least')]
增加超时时间以确认提供的超时时间是否正确,您也可以使用调试模式进行确认。如果问题仍然存在,请检查“助攻(至少)”元素不属于任何框架。
如果问题未解决,您还可以分享 DOM 和正确的错误消息。
我有几个建议你可以试试,
- 确保底部加载的内容不在框架中。如果是,则需要切换到特定帧
- 检查 XPath 是否正确,尝试从 Developer Console 匹配 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,在查看页面源中搜索iframe,如果找到您要查找的那个字段,则先切换到那个框架。 driver.switch_to.frame("iframe 的名称")
- 尝试在页面上添加超时重试逻辑和刷新按钮(如果有) st = time.time() 而 st+180>time.time(): 尝试: element2 = WebDriverWait(driver, 6).until( EC.visibility_of_element_located( (By.XPATH, "//*[text()='Assists (At Least)']") ) ) 除了: 通过
您需要的内容在 iFrame 中。您可以先切换到它来访问它,如下所示:
iframe=driver.find_element_by_css_selector('iframe[class="player-props-frame"]')
driver.switch_to.frame(iframe)