预期条件:等待,直到一个元素可点击,而另一个元素消失



我面临以下问题:有一个页面(不幸的是,它不是公共的)带有Register requestApprove request按钮。单击按钮将打开一个带有弹出窗口的透明div

算法如下:1) 单击Register;2) 在凸起的弹出窗口中填写表格;3) 点击Submit确认注册(关闭弹出窗口);4) 单击Approve

所以我使用以下代码:

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@id="RegisterButton"]'))).click()
# ...Filling Register form...
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@id="SubmitButton"]'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@id="ApproveButton"]'))).click()

但是,尽管使用了EC.element_to_be_clickable(),我还是得到了以下错误:

WebDriverException: Message: unknown error: 
Element is not clickable at point (338, 167). 
Other element would receive the click: <div class="modal fade" id="confirmWindow" style="display: block;">...</div>

似乎驱动程序认为Approve已经可以点击,并试图在透明div仍然显示的情况下点击它。

因此,我需要一个Expected Conditions语句来捕捉已经选择div时的状态,如果按钮是可点击的,则需要Approve

附言:我使用time.sleep()来做这件事,但这似乎是一个粗略的方法

更新

我尝试使用JavaScript:

driver.execute_script('document.getElementById("ApproveButton").click();')

到目前为止,它是有效的。。。我想知道这是否真的是一种更好的点击按钮的方式,或者可能也会有一些障碍?

可以理解,您需要避免使用time.sleep()。由于它点击了模态,我假设该按钮被认为是可点击的,即使模态还没有完全消失。在这种情况下,我将添加另一个等待,等待模式不再可见。

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@id="RegisterButton"]'))).click()
# ...Filling Register form...
wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@id="SubmitButton"]'))).click()
# Wait till the modal is no longer visible
wait.until_not(EC.visibility_of_element_located((By.ID, 'confirmWindow')))
wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@id="ApproveButton"]'))).click()

注意:我还创建了WebDriverWait的一个实例,而不是像您在示例中那样为每个等待创建一个新实例。没有必要一直创建一个新实例。

最新更新