我正在运行一个Python脚本,该脚本使用Selenium + Chromedriver在Web应用程序上自动执行一系列操作。其中一些操作会导致页面或框架重新加载。由于Selenium没有内置的“等待页面加载”功能,我宁愿不使用time.sleep(x)如果可以避免它,我经常使用这个组合:
wait = WebDriverWait(driver, 10)
driver.find_element_by_id("sysverb_update_and_stay").click() #causes form to submit and data to load
element = wait.until(EC.presence_of_element_located((By.ID, "view.change_task.parent")))
element = wait.until(EC.element_to_be_clickable((By.ID, "view.change_task.parent")))
基于我读过的文档(以及属性本身的名称),我预计脚本会等到具有该ID的元素出现之后再继续,并且如果它没有找到脚本中的元素内置超时,只有这样脚本才会崩溃并引发异常。但是,只要脚本命中第一个等待行,它就会崩溃并抛出以下异常:
追踪(最近一次通话): 在test_change_control中输入第137行“servicenow.py” element = wait.until(EC.presence_of_element_located((By.ID,“view.change_task.parent”) )) ... selenium.common.exceptions.WebDriverException:消息:未知错误:未处理的inspec tor错误:{“code”: - 32000,“message”:“无法找到具有指定ID的上下文”}
如果它无法通过ID找到该元素,那么它是否应该等待它存在?我在这里缺少什么?
编辑:在上面的代码中添加了等待,并在下面的元素中添加了HTML:
<a id="view.change_task.parent" name="view.change_task.parent" style="" class="btn btn-default btn-ref icon icon-info" data-type="reference_popup" data-table="change_task" data-form="task.do" data-ref="change_task.parent" data-ref-key="null" data-view="" tabindex="-1"><span class="sr-only">View - Opens reference record in current window</span></a>
答案 0 :(得分:0)
这似乎是早期版本的Chromedriver的一个问题 - 更新到最新版本似乎解决了这个问题。