蟒蛇.硒.如何等待新窗口打开?

Mic*_*ael 3 python selenium selenium-webdriver

我有一个带有twitter的按钮,点击新窗口打开后,但在打开之前有几秒钟的时间,所以有没有办法等待它?我现在打得很糟糕......

    Ui.click_el(link.W9FormNodes.TWITTER_BUTTON)
    # Wait for new window and switch to it
    time.sleep(3)
    aw = driver.window_handles
    driver.switch_to_window(aw[1])
Run Code Online (Sandbox Code Playgroud)

所以我需要更好的东西,只需要等待所需的秒数.

我想我是这样解决的.但也许有人会评论如何做得更好.

    aw = Ui.click_and_wait_for_window(link.W9FormNodes.TWITTER_BUTTON)
    driver.switch_to_window(aw[1])
Run Code Online (Sandbox Code Playgroud)

这是一个单击按钮并等待新窗口的方法:

    def click_and_wait_for_window(self, node):
        current_value = old_value = self.driver.window_handles
        self.click_el(node)
        while len(current_value) == len(old_value):
            time.sleep(0.05)
            current_value = self.driver.window_handles
        return current_value
Run Code Online (Sandbox Code Playgroud)

Lou*_*uis 5

正如苏里亚所说,WebDriverWait将是等待变革的方式.您可以拥有这样的上下文管理器,它只实现等待逻辑,然后将其用于您关心的任何类型的操作:

@contextmanager
def wait_for_new_window(driver, timeout=10):
    handles_before = driver.window_handles
    yield
    WebDriverWait(driver, timeout).until(
        lambda driver: len(handles_before) != len(driver.window_handles))
Run Code Online (Sandbox Code Playgroud)

这是一个完整的工作示例:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

from contextlib import contextmanager

@contextmanager
def wait_for_new_window(driver, timeout=10):
    handles_before = driver.window_handles
    yield
    WebDriverWait(driver, timeout).until(
        lambda driver: len(handles_before) != len(driver.window_handles))

driver = webdriver.Chrome()

driver.get("http://www.google.com")

with wait_for_new_window(driver):
    driver.execute_script("""
    window.open("http://www.google.com", "_blank");
    """)

with wait_for_new_window(driver, 2):
    pass # This will obviously hit the timeout.

driver.quit()
Run Code Online (Sandbox Code Playgroud)