当前位置: 首页 > 知识库问答 >
问题:

Python 3.5 - 硒 - 如何处理新窗口并等到它完全加载?

唐修诚
2023-03-14

我正在进行浏览器自动化,并且我在某个时候被阻止:在某个时刻,我要求浏览器单击一个按钮,这反过来又打开了一个新窗口。但有时互联网太慢,所以这个新窗口需要时间来加载。我想知道我怎么能让硒等到这个新的新窗口完全加载。

这是我的代码:

driver.switch_to.default_content()
Button = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'addPicturesBtn')))
Button.click()
newWindow = driver.window_handles
time.sleep(5)
newNewWindow = newWindow[1]
driver.switch_to.window(newNewWindow)
newButtonToLoad = driver.find_element_by_id('d')
newButtonToLoad.send_keys('pic.jpg')
uploadButton = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, 'uploadPics')))
uploadButton.click()
driver.switch_to.window(newWindow[0])

我不时收到此错误:

newNewWindow = newWindow[1]

索引错误: 列表索引超出范围

这让我觉得简单的“time.sleep(5)”并不能完成这项工作。

所以,我的问题是,如何才能等到这个新窗口完全加载后再与它交互?

谢谢

共有3个答案

仲孙逸明
2023-03-14

等待新窗口完全加载的确切答案是:

使用< code>expected_conditions中的< code>url_changes,旧的url参数为“about:blank”:

WebDriverWait(Driver, 15).until(EC.url_changes("about:blank"))

示例代码可能如下所示:

        ...
        # Wait till a new window opened (2nd window in this example)
        WebDriverWait(Driver, 15).until(EC.number_of_windows_to_be(2))

        # Switch to second window
        window_after = Driver.window_handles[1]
        Driver.switch_to.window(window_after)

        # Wait till **new window fully loaded**:
        WebDriverWait(Driver, 15).until(EC.url_changes("about:blank"))
        ...
裴意
2023-03-14

我正在使用的:

windows = set(driver.window_handles)
driver.execute_script("window.open()")
WebDriverWait(driver, 20).until(EC.new_window_is_opened(windows))
hwnd = list(set(driver.window_handles) - windows)[0]

如果你觉得有必要,你可以创建一个函数或上下文管理器,就像这个答案一样,但对于基本上3行(不算实际打开窗口的那行,每种情况下可能非常不同),我更喜欢复制粘贴。

为了彻底起见,这里有一个功能丰富的替代方案:

@contextmanager
def wait_for_new_window(driver, timeout=10, switch=True):
    """Waits for a new window to open

    Parameters:
        driver: WebDriver.
            Selenium WebDriver object.
        timeout: int
            Maximum waiting time
        switch: bool
            If `True` (default), switches to the window.


    Exemplo:
        >>> with wait_for_new_window(driver) as hwnds:
        ...     driver.execute_script("window.open()");
        ... print("Window opened:", hwnds[0])
    """
    windows = set(driver.window_handles)
    handle = []
    yield handle
    WebDriverWait(driver, timeout).until(EC.new_window_is_opened(windows))
    hwnds = list(set(driver.window_handles) - windows)
    handle.extend(hwnds)
    if switch:
        driver.switch_to.window(hwnds[0])
符风畔
2023-03-14

您可以尝试使用以下代码等待新窗口出现:

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))

您的代码应如下所示

Button.click()

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))

newWindow = driver.window_handles
newNewWindow = newWindow[1]
driver.switch_to.window(newNewWindow)

考虑到@JimEvans的评论,请尝试以下方式:

current = driver.window_handles[0]
Button.click()

WebDriverWait(driver, 20).until(EC.number_of_windows_to_be(2))

newWindow = [window for window in driver.window_handles if window != current][0]
driver.switch_to.window(newWindow)
 类似资料:
  • 问题内容: 我正在执行浏览器自动化,并且在某个时候被阻止:稍后,我要求浏览器单击一个按钮,该按钮又打开一个新窗口。但是有时Internet太慢,因此加载新窗口需要时间。我想知道如何让Selenium等待,直到这个新窗口完全加载完毕。 这是我的代码: 我不时收到此错误: newNewWindow = newWindow [1] IndexError:列表索引超出范围 这让我认为简单的“ time.s

  • 我目前正在使用硒自动化应用程序,当单击按钮时会出现一个新的弹出窗口。我必须切换到该窗口并执行某些操作,例如搜索记录。 注意:父窗口和子窗口具有相同的标题。

  • 我用JAVA开发了硒自动化框架,我面临一个问题。当我点击任何按钮说过滤器或清除过滤器应用程序显示一个加载窗口,之后,我们能够执行下一个动作。我添加了以下代码,等待加载窗口可见假,但它不起作用。 在Web元素中,我传递了那个加载窗口XPATH。每次代码没有等待窗口关闭开始单击按钮并抛出异常 未知错误:元素...在点(178,391)不可单击。其他元素将收到点击: 我还为click添加了代码 请帮助我

  • 问题内容: 我使用AJAX在页面A上显示页面B的内容。 如何在内容显示之前让jQuery等待所有内容加载(文本,图像等)? 当处理AJAX请求时,我使用beforeSend向用户显示加载动画。现在,我想“延长”等待时间,以便在加载所有图像之前加载动画不会消失。 我最初尝试隐藏附加数据,等待所有图像加载,然后显示内容- 内部但事件似乎没有触发。 有任何想法吗? 更新: 更新的代码: 问题答案: 您必

  • 如何将 OpenGl 显示器附加到 J 框架,以便在关闭 JFrame 时破坏显示器?这是我到目前为止的代码: 在我进行可运行之前,我已经将开放显示器连接到JFrame。但是在添加可运行的显示器后,显示屏现在显示的尺寸与我的屏幕尺寸相同。我已尝试重新排列 和 但是没有什么变化,opengl显示仍然是相同的大小,当我尝试先关闭JFrame而不是先关闭显示时,我得到了以下错误: 这让我想到我的 我猜这

  • 如何使SeleniumWebDriver在只有src属性的情况下等待iframe完全加载。我试图创建一个测试用例,其中包含表单元素的iframe从不同的源加载,而切换到此iframe时,此iframe的内容不可用,因此测试失败。因此,我如何使Webdriver等待iframe完全加载。