我有一个带有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])
所以我需要更好的东西,只需等待所需的秒数。
我想我是这样解决的。但也许有人会评论如何做得更好。
aw = Ui.click_and_wait_for_window(link.W9FormNodes.TWITTER_BUTTON)
driver.switch_to_window(aw[1])
这是一个点击按钮并等待新窗口的方法:
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
答案 0 :(得分:5)
正如苏里亚所说,WebDriverWait
将是等待改变的方式。您可以拥有这样的上下文管理器 only 实现等待逻辑,然后将其用于您关心的任何操作:
@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))
这是一个完整的工作示例:
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()
答案 1 :(得分:1)
是;你的实现看起来很好。只有你需要设置超时,否则它会等待,如果新窗口没有打开。
您可以与WebDriverWait(driver, 10).until..
结合使用来设置超时。
希望这会有所帮助。