Selenium WebDriverWait 无法检测用于使用 Selenium 提交嵌入式视频答案的表单元素

问题描述 投票:0回答:1

我一直在使用 Selenium 编写一个机器人来自动化学校强迫我做的系列教程。 在本教程中,有一个视频在中途提示用户填写表格和一些问题。 我一直在尝试使用此代码在视频播放时等待,直到表单可见

    WebDriverWait(driver, 1000).until(
        EC.presence_of_element_located((By.ID, "answer_content_A11A59DC-2C74-11EE-83FC-C435C68A4852"))
    )


此 ID 在视频开始时不可见,但一旦表格出现就可以找到。 但是,该脚本永远不会越过 WebDriverWait() 块。

我也尝试过根据其他元素的存在进行等待,但它们似乎提出了同样的问题。 每次他们都卡在 WebDriverWait() 上。

然后我尝试等待 30 秒让表单变得可见,但这也不起作用。

    #Presses Play on Video
    driver.find_element(By.CLASS_NAME, "slip_button_icon").click()
    #Full duration of Video
    time.sleep(30)
    driver.find_element(By.ID, "answer_content_A11A59DC-2C74-11EE-83FC-C435C68A4852").click()

即使当我在 Selenium 浏览器中命令 F ID 时我能够找到它,也会出现此错误。

发生错误:消息:没有此类元素:无法定位元素:{"method":"css 选择器","selector":"[id="answer_content_A11A59DC-2C74-11EE-83FC-C435C68A4852"]"} (会话信息:chrome=127.0.6533.72);有关此错误的文档,请访问:https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception

python selenium-webdriver selenium-chromedriver
1个回答
0
投票

您必须确认 ID 没有动态更改或更新。使用浏览器开发人员工具来验证这一点或尝试其他定位器,例如

By.CLASS_NAME
By.XPATH
By.CSS_SELECTOR

有时,如果元素存在但尚不可见或不可交互,则使用

presence_of_element_located
可能还不够。考虑使用
visibility_of_element_located
:

WebDriverWait(driver, 60).until(
    EC.visibility_of_element_located((By.ID, "answer_content_A11A59DC-2C74-11EE-83FC-C435C68A4852"))
)

有时候,需要等待特定的JS事件或者等待网络空闲。您可能需要使用 JS 执行来判断 AJAX 请求是否完成:

WebDriverWait(driver, 60).until(
    lambda d: d.execute_script('return document.readyState') == 'complete'
)

有时视频位于 iframe 中,必须切换到该帧才能捕获元素。

WebDriverWait(driver, 30).until(
    EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe"))  
)
© www.soinside.com 2019 - 2024. All rights reserved.