如何使用Selenium和Python确定模态视图是否仍然可见或在不确定的时间后最终关闭?

icnyk63a  于 2023-07-01  发布在  Python
关注(0)|答案(1)|浏览(77)

我有一个模态视图,它要求用户提供某些细节,如标题,描述等,用于网站上的列表创建任务。一旦你输入了所有的细节,你可以点击保存,模式视图需要几秒钟的时间来保存(显示一个微调器),然后关闭。
我的问题是,除了手动指定time.sleep(5)(这是非常低效的)之外,我找不到任何方法来确定在保存操作之后何时可以安全地单击下一步按钮。
保存操作有时可能需要超过4或5秒的时间,具体取决于网络条件和要保存的数据量。我尝试使用.is_displayed(),isEnabled()引用元素,但似乎没有任何效果。如果一个像模式上的保存按钮这样的元素存在,我可以找到它,但是一旦模式关闭,代码就会从DOM中消失,找到的元素超出范围,并导致try,except触发。
真的有这么难吗还是我犯了个愚蠢的错误只是没发现?
作为参考,网页在div中加载模态,在模态不显示之前和之后:
<div id="modal-outlet"></div>
以及在模态显示期间(只是块的开始,因为它的代码量相当大):

<div id="modal-outlet"><div aria-hidden="false" id="ember1234" class="modal-overlay modal-overlay--layer-default modal-overlay--is-top-layer  ember-view">      <div data-test-modal="" role="dialog" tabindex="-1" class="modal modal--layer-default edit-content-modal" size="x-large" aria-labelledby="-edit-content-modal">
        <span class="a11y-text">Dialog content start.</span>
        <button data-test-modal-close-btn=""

如果HTML背景故事有帮助话。任何帮助都很感激。

de90aj5v

de90aj5v1#

你可以创建一个方法wait_for_element_not_visible(),它使用EC.invisibility_of_element()来等待一个元素不再可见:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

def wait_for_element_not_visible(
    driver, selector, by="css selector", timeout=10
):
    try:
        return WebDriverWait(driver, timeout).until(
            EC.invisibility_of_element((by, selector))
        )
    except Exception:
        raise Exception(
            "Element {%s} was still visible after %s seconds!"
            % (selector, timeout)
        )

从你的代码中,你可以调用:

wait_for_element_not_visible(driver, "#modal-outlet")

并且等待将继续,直到元素不再可见,或者等待持续的时间超过超时,在这种情况下将引发异常。

相关问题