对于使用Selenium和Python的测试,我需要在2个用户的情况下打开2个浏览器会话,并在窗口1中进行更改时在另一个窗口中检查更新。 我可以通过将其打开为Chrome隐身模式而与其他用户打开第二个会话,但我不确定如何在两个打开的浏览器会话之间来回切换。
我尝试了以下提取作为示例,但由于第二个窗口是使用driver.get
的新窗口,[-1]
似乎无法将焦点重新调回window_before
:
window_after = driver.window_handles[0]
print('windows after', window_after)
time.sleep(2)
driver.switch_to.window(driver.window_handles[-1])
答案 0 :(得分:1)
您应该为第二个用户会话实例化第二个驱动程序:
driver1 = webdriver.Chrome()
driver2 = webdriver.Chrome()
特定驱动程序实例的所有窗口共享相同的cookie;因此,您无法打开新窗口并期望创建第二个用户会话。第二个窗口将“看到”与第一个相同的cookie,导致它们被发送到您的网站,其中您的应用将看到访问者已经在第一个用户会话下登录。
创建第二个驱动程序实例为您提供了第二个隔离的cookie池(以及本地和会话存储),使您可以安全可靠地创建第二个用户会话。
虽然您可能已经找到了在同一驱动程序实例中打开隐身/私有窗口的方法,但WebDriver规范(构建Selenium)不支持此功能,因此不太可能跨浏览器和平台移植。
capybara-py可以根据需要轻松透明地实例化新的驱动程序实例:
import capybara
def test_concurrent_editors(page):
page.visit("/")
page.click_link("Sign In")
page.fill_in("Username", value="alice@example.com")
page.fill_in("Password", value="s33krit")
page.click_button("Sign In")
# ... do things with the default session
with capybara.using_session("other user"):
page.visit("/")
page.click_link("Sign In")
page.fill_in("Username", value="bob@example.com")
page.fill_in("Password", value="p@ssw0rd")
page.click_button("Sign In")
# ... do things with the "other user" session
# .... do more things with the default session
with capybara.using_session("other user"):
# ... do more things with the "other user" session
(注意:它带有一个pytest插件,可以公开page
夹具,并在每次测试之间重置所有会话。)