在自学python的过程中遇到很多问题,有时候明明觉得没问题但是就是报错,检查了感觉定位的路劲也没问题啊,怎么会呢,后来查询了很多才知道 有frame和窗口切换导致我定位的路径没问题就是打不开我定位的页面,在CSDN很多博主哪里知识都开始收费 看不到里面的详细介绍,在知乎上看到一篇文章非常的不错 很详细。
当我们遇到frame嵌套页面时,WebDriver只能在一个页面上进行元素识别,没法对frame间或frame内的元素进行定位,需要通过switch_to.frame()切换frame再进行定位。而对于不同的窗口间切换,Selenium2.0中提供了switch_to.window()方法,可以切换到任意的窗口
2.1 多frame表单切换
多frame表单切换示意图:
在web页面中有4个元素,元素1、元素2、frame1下的元素3、frame2下的元素4,如果定位元素3,就需要先切换到frame 1,再定位元素3 。如果想定位元素4,就要先切回web页面,再跳转到frame 2 ,最后才能定位到元素4 。
部分html代码如下:
<html>
<body>
......
<div class="row-fluid">
<div class="s1">
<h3>frame1</h3>
<iframe id="search_1" name="af" src="http://www.xx.com" width="800" height="300">
<input name='value' id='s_value'>
</iframe>
</div>
</div>
<div class="row-fluid">
<div class="s2">
<h3>frame2</h3>
<iframe id="search_2" name="bf" src="http://www.xx2.com" width="800" height="300">
<input name='value2' id='s_name'>
</iframe>
</div>
</div>
......
</body>
</html>
根据元素定位以及frame定位方法,代码如下:
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
#打开火狐浏览器
driver=webdriver.Firefox()
# 打开url地址
driver.get("https://www.xx.com")
# 要定位元素id为s_value,就要先跳转到iframe1
driver.switch_to.frame("search_1")
#再定位到id:s_value
driver.find_element_by_id("s_value")
# 切回主页面
driver.switch_to.default_content()
# 要定位元素id为s_name,就要先跳转到iframe2
driver.switch_to.frame("search_2")
#再定位到id:s_name
driver.find_element_by_id("s_name")
# 切回上级iframe
driver.switch_to_parent_frame()
#关闭浏览器
driver.quit()
2.2 多窗口切换
多窗口示意图,如下图所示:
对于多窗口切换,我们要先获取到当前窗口和所有窗口,再逐一判断是否是我们所需要的窗口:
# -*- coding:utf-8 -*-
from selenium import webdriver
#打开火狐浏览器
driver=webdriver.Firefox()
# 打开url地址
driver.get("https://www.xx.com")
#获得当前窗口
curr_handle=driver.current_window_handle
#打开新窗口
driver.find_element_by_id("new_window").click()
#获取所有的窗口
all_handles=driver.window_handles
#循环判断窗口是否为当前窗口
for handle in all_handles:
if handle != curr_handle:
driver.switch_to.window(handle)
print("跳转到非当前窗口!")
#跳转到原先的窗口
driver.switch_to.window(curr_handle)
#关闭浏览器
driver.quit()