【问题标题】:Selenium Not Finding Element Present in HTML Even After Waiting for DOM to update即使在等待 DOM 更新之后,Selenium 也找不到 HTML 中存在的元素
【发布时间】:2021-03-01 22:43:40
【问题描述】:

我正在尝试在信息不立即存在的网站上抓取信息。当您单击某个按钮时,页面开始在页面底部加载新内容,加载完成后,红色文本显示为“Assists (At Least)”。我能够找到第一个按钮“Go to Prop builder”,它不会立即显示在页面上,但是在脚本单击该按钮后,尝试查找“Assists(至少)”文本时会超时,尽管脚本处于休眠状态并出现在屏幕上。

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

【问题讨论】:

    标签: python selenium selenium-webdriver webdriverwait


    【解决方案1】:

    问题是 Assist 元素位于框架下。您需要像这样切换到框架:

    frame = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME,"player-props-frame")))
    driver.switch_to.frame(frame)
    

    【讨论】:

      【解决方案2】:
      1. 检查页面中是否有任何 iframe,在查看页面源中搜索 iframe,如果找到任何您要查找的字段,则先切换到该框架。 driver.switch_to.frame("iframe 的名称")
      2. 尝试在页面上添加一个带超时的重试逻辑和一个刷新按钮(如果有) st = time.time() 而 st+180>time.time(): 尝试: element2 = WebDriverWait(驱动程序,6).until( EC.visibility_of_element_located( (By.XPATH, "//*[text()='Assists (At Least)']") ) ) 除了: 通过

      【讨论】:

        【解决方案3】:

        增加超时时间以确认提供的超时时间是正确的,您也可以使用调试模式进行确认。如果问题仍然存在,请检查“协助(至少)”元素不属于任何框架。

        如果问题未解决,您还可以共享 DOM 和正确的错误消息。

        【讨论】:

          【解决方案4】:

          我有几个建议你可以试试,

          • 确保在底部加载的内容不在框架中。如果是,则需要切换到特定帧
          • 检查 XPath 是否正确,从开发者控制台尝试 XPath 是否匹配

          在浏览器中检查元素,一旦开发者控制台打开,按 CTRL +F,然后尝试您的 XPath。如果它没有突出显示检查框

          【讨论】:

            【解决方案5】:

            您想要的内容在 iFrame 中。您可以先切换到它来访问它,如下所示:

            iframe=driver.find_element_by_css_selector('iframe[class="player-props-frame"]')
            driver.switch_to.frame(iframe)
            

            【讨论】:

              【解决方案6】:

              圆括号是这里的问题(至少在某些情况下......)。如果可能,请使用 .contains 选择器: //*[contains(text(),'Assists ') and contains(text(),'At Least')]

              【讨论】:

              • 我试过了,但仍然出现超时异常。还有另一个类似的元素显示没有圆括号的文本“FAQ”,我尝试用它而不是“Assists(至少)”进行搜索,但也出现超时异常
              猜你喜欢
              • 1970-01-01
              • 2020-12-03
              • 1970-01-01
              • 1970-01-01
              • 2018-10-09
              • 1970-01-01
              • 2021-12-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多