在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
以百度首页和百度注册页为例,在两个窗口之间的切换如下图。
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 获得百度搜索窗口句柄
sreach_windows = driver.current_window_handle
driver.find_element_by_link_text('登录').click()
driver.find_element_by_link_text("立即注册").click()
# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles
# 进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
driver.switch_to.window(handle)
print('now register window!')
driver.find_element_by_name("account").send_keys('username')
driver.find_element_by_name('password').send_keys('password')
time.sleep(2)
# ……
driver.quit()
在本例中所涉及的新方法如下:
current_window_handle:获得当前窗口句柄。
window_handles:返回所有窗口的句柄到当前会话。
switch_to.window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
如果报错找不到元素,首选使用一下之前的显示等待和隐式等待,如果还报错,去目标网站打开开发者模式,看看元素的name或id变了没有。我就是改了这两个地方,最后是成功的。
selenium23334 创建于 2021-03-02 17:45:24
我的问题已解决,在点击“立即注册”窗口后,需要等待几秒,设置了一个sleep(2)就可以了
rookie 创建于 2020-03-25 14:35:05
我想问一下,我运行这个程序的时候,到了打开注册页面就没有往下走了。 print('now register window!')这句也没有打印出来,是不是for循环都没有进入。有人能帮忙解答一下吗,谢谢
rookie 创建于 2020-03-25 13:52:36
试着回复一下【ella 创建于 2019-11-20 21:43:00】朋友的问题 需要等待元素加载完成,wait一下 这里可以试着结合之前的知识显式等待或者隐式等待
cccrush 创建于 2020-02-05 11:00:42
driver.find_element_by_link_text("立即注册").click()每次运行到这里都报错 selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"立即注册"} 请问是什么原因呢?求助
ella 创建于 2019-11-20 21:43:00
用id定位,可以顺利输入密码: driver.find_element_by_id('TANGRAM_PSP_4_password').send_keys('password')
danike 创建于 2019-10-05 19:47:50
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable 查了可能是for循环的问题,待解
杨道林 创建于 2019-07-18 18:11:28
driver.find_element_by_name("account").send_keys('username') 运行时提示no such element
lulu晶 创建于 2019-04-28 14:41:30