selenium窗口结构——句柄切换

在自动化测试过程中,会遇到打开新窗口的的情况,这时候需要进行句柄切换来对新窗口进行一系列的操作。

一、什么时候需要用到切换

1、有时候当我们使用selenium,模拟网页点击的时候,会出现一个新的窗口或者新的标签。但是,此时,我们的driver没有及时更新,还是开始页面时的那个窗口的模拟登入(其实也就是一个句柄,“句柄是一种特殊的智能指针”,这个句柄指向最开始的页面)。但是,当我发生点击动作的时候,页面发生切换,但是句柄还是原始的句柄,此时我们需要切换句柄操作,来调整至新出现的界面。
2、在selenium进行定位的时候,会遇到frame结构,这个时候如果使用xpath直接进行定位会定位失败,所以这时候也需要进行切换

二、获取当前窗口句柄

1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。

2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。

3.获取当前页面的句柄:driver.current_window_handle

三、获取所有句柄

获取当前所有的句柄:window_handles

四、切换句柄

切换句柄:switch_to.window()

next_click.click()  # 模拟点击下一页的时候,会出现一个新窗口或者新标签
"""获取全部句柄"""
all_handles = self.driver.window_handles  # 这个时候会生成一个新窗口或新标签页的句柄,代表这个窗口的模拟driver
"""切换新页面"""
driver.switch_to.window(all_handles[1])  # driver切换至最新生产的页面
"""页面顺序从0开始"""

上面是切换句柄比较简单的方法,还有一种使用判断语句,小编在此给参考代码

# coding:utf-8
 
from selenium import webdriver
 
driver = webdriver.Firefox()
 
driver.get("http://bj.ganji.com/")
 
h = driver.current_window_handle
 
print h  # 打印首页句柄
 
driver.find_element_by_link_text("招聘求职").click()
 
all_h = driver.window_handles
 
print all_h     # 打印所有的句柄
 
 #方法一:判断句柄,不等于首页就切换
 
 for i in all_h:                      
 
     if i != h:
 
         driver.switch_to.window(i)
 
         print driver.title
 
# 方法二:获取list里面第二个直接切换
 
driver.switch_to.window(all_h[1])
 
print driver.title
 
# 关闭新窗口
 
driver.close()
 
# 切换到首页句柄
 
driver.switch_to.window(h)
 
# 打印当前的title
 
print driver.title
 
selenium(python+java)

五、遇到iframe结构

在selenium使用xpath进行定位的时候,会遇到frame结构,FRAME(框架)是Web上经常会看到的页面结构。此时需要进行跳转frame框架内,再执行定位。

self.driver.get("https://y.qq.com/")
self.driver.find_element(By.XPATH,'//span[@class="mod_top_login"]/a').click()
"""定位到iframe"""
iframe = self.driver.find_element(By.XPATH,'//div[@class="login-box-bd__item current"]/iframe')
"""跳转到结构内"""
self.driver.switch_to.frame(iframe)
"""定位到第二个iframe"""
iframe_2 = self.driver.find_element(By.XPATH, '//div[@class="lay_login_form"]/iframe')
"""继续跳转"""
self.driver.switch_to.frame(iframe_2)
locator = (By.LINK_TEXT,'密码登录')
WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable(locator))  #显示等待,等待元素出现
self.driver.find_element(By.XPATH,'//div[@class="bottom hide"]/a[@id="switcher_plogin"]').click()  #元素出现后进行下一步操作
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Selenium进行多窗口切换时,可以使用WebDriver提供的switch_to.window()方法。具体操作步骤如下: 1. 首先,使用driver.current_window_handle方法获取当前窗口句柄。 2. 使用driver.window_handles方法获取所有窗口句柄。 3. 使用driver.switch_to.window()方法,将主机切换到需要操作的窗口上。可以通过传递窗口句柄作为参数来指定要切换窗口。 4. 可以使用driver.title方法来获取当前窗口的标题,以确认是否切换成功。 5. 如果需要关闭新打开的窗口,可以使用driver.close()方法。 以下是一个具体的示例代码: ```python from selenium import webdriver # 创建浏览器实例 driver = webdriver.Chrome() # 打开网页 driver.get("https://www.sina.com.cn/") # 点击链接打开新窗口 driver.find_element_by_link_text("军事").click() # 获取当前窗口句柄 current_handle = driver.current_window_handle print(current_handle) # 获取所有窗口句柄 all_handles = driver.window_handles print(all_handles) # 切换至第二个窗口 driver.switch_to.window(all_handles) # 打印新窗口标题 print(driver.title) # 关闭新窗口 driver.close() ``` 通过以上步骤和代码示例,您可以在Selenium中实现多窗口切换句柄的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python爬虫之Selenium窗口切换的实现](https://download.csdn.net/download/weixin_38742927/14839486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Selenium--多个窗口切换句柄](https://blog.csdn.net/weixin_44688529/article/details/126671931)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值