我一直在使用 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
您必须确认 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"))
)