Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 即使在等待DOM更新之后,Selenium也找不到HTML中存在的元素_Python_Selenium_Selenium Webdriver_Webdriverwait - Fatal编程技术网

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,在查看页面源中搜索iframe,如果找到要查找的字段,则首先切换到该帧。 驱动程序.切换到.frame(“iframe的名称”)
  • 尝试添加带超时的重试逻辑,以及页面上的刷新按钮(如果有) st=时间。时间() 而st+180>time.time(): 尝试: element2=WebDriverWait(驱动程序,6)。直到( EC.元素的可见性( (By.XPATH,“/*[text()='Assists(至少)'”) ) ) 除: 通过

  • 您想要的内容位于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(至少)”,但也出现了超时异常