今天继续讲知识点,关于切换,因为我们在元素定位的时候,明明在网页下面f12可以定位到,但是就是写代码的时候发现不行,今天的切换就可以解决这个问题
一、iframe切换
先抛出一个问题:
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508180858045-913639837.png)
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508180931154-936456505.png)
1.1方式一:通过iframe标签的name属性进行切换
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
driver.get('https://qzone.qq.com/')
# 方式一:通过iframe标签的name属性进行切换
driver.switch_to.frame("login_frame")
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508181122719-1299822662.png)
1.2方式二:先定位iframe,通过定位到的元素进行切换
先定位iframe,通过定位到的元素进行切换
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
driver.get('https://qzone.qq.com/')
# 方式二:先定位iframe,通过定位到的元素进行切换
login_frame = driver.find_element(By.XPATH, '//iframe[@id="login_frame"]')
driver.switch_to.frame(login_frame)
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508181428287-2101820757.png)
1.3方式三:通过iframe标签的下标索引位置,进行切换
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
driver.get('https://qzone.qq.com/')
# 方式三:通过iframe标签的下标索引位置,进行切换
driver.switch_to.frame(0)
driver.find_element(By.ID, 'switcher_plogin').click()
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508181905028-1431466317.png)
其他:如何从iframe中切换到原来的页面中
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210508182129841-724683579.png)
二、窗口切换
2.1切换进入新的窗口
打开一个新的窗口后,怎么在新的窗口标签页中,才有效?
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
# 打开百度
driver.get('https://www.baidu.com/')
# 在百度的输入框输入58同城,并点击百度一下按钮
driver.find_element(By.ID, 'kw').send_keys("58同城")
driver.find_element(By.ID, 'su').click()
# 选择百度页面搜索结果的第一个进行点击,进入新的窗口
driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click()
# 获得所有窗口的句柄
all_handles = driver.window_handles
# 通过获取句柄的方式切换到新打开的58同城窗口
driver.switch_to.window(all_handles[-1])
# 在新的窗口链接中(也就是打开的58同城页面中)的搜素框中输入python
driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python")
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509120240167-1181172550.png)
2.2两个窗口之间的切换
比如,从新的窗口中切回去,怎么办?
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
# 打开百度
driver.get('https://www.baidu.com/')
# 在百度的输入框输入58同城,并点击百度一下按钮
driver.find_element(By.ID, 'kw').send_keys("58同城")
driver.find_element(By.ID, 'su').click()
# 选择百度页面搜索结果的第一个进行点击,进入新的窗口
driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click()
# 获得所有窗口的句柄
all_handles = driver.window_handles
# 通过获取句柄的方式切换到新打开的58同城窗口
driver.switch_to.window(all_handles[-1])
# 在新的窗口链接中(也就是打开的58同城页面中)的搜素框中输入python
driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python")
# 如果我要返回原来的窗口,怎么切换?目前我这里只有两个窗口
# 选择句柄为第一个位置的,切回去
driver.switch_to.window(all_handles[0]) # 运行结果,此时已经显示原来的网页
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509120458965-253036422.png)
2.3多个窗口的切换
如果在项目需求中,需要打开打开多个窗口,并不停的在多个网页之间来回切换,这种用代码如何来处理?
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509120648914-1197568868.png)
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
# 打开百度
driver.get('https://www.baidu.com/')
# 在百度的输入框输入58同城,并点击百度一下按钮
driver.find_element(By.ID, 'kw').send_keys("58同城")
driver.find_element(By.ID, 'su').click()
# 记录当前百度输入58的句柄
baidu_58_handle = driver.current_window_handle
# 选择百度页面搜索结果的第一个进行点击,进入新的窗口
driver.find_element(By.XPATH, "//a[@data-url='http://www.58.com']").click()
# 获得所有窗口的句柄
all_handles = driver.window_handles
# 通过获取句柄的方式切换到新打开的58同城窗口
driver.switch_to.window(all_handles[-1])
# 在新的窗口链接中(也就是打开的58同城页面中)的搜素框中输入python
driver.find_element(By.XPATH, "//input[@id='keyword']").send_keys("python")
time.sleep(2)
# 记录点击第一个58同城的句柄
no1_58_handle = driver.current_window_handle
# 如果我要返回原来的窗口,怎么切换?
driver.switch_to.window(baidu_58_handle) # 运行结果,此时已经显示原来的网页
# 那么我选择原来网页的其他的搜索结果进行点击,比如我选择下面的58同城找工作网
driver.find_element(By.XPATH, "//div[@id='5']").click()
# 这里进行窗口切换,-1是最新的那个
driver.switch_to.window(all_handles[-1])
# 记录找工作58网的句柄
job58_handle = driver.current_window_handle
# 接下来,想怎么切就怎么切换,只要前面有记录就可以
driver.switch_to.window(baidu_58_handle)
driver.switch_to.window(no1_58_handle)
driver.switch_to.window(job58_handle)
time.sleep(5) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509121243465-1273861667.png)
三、alert切换
在做项目的时候,偶尔会碰到一些alert弹窗,这种情况,如何来切换进入后对其进行操作呢?
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509131534436-700379120.png)
"""
alert弹窗切换:driver.switch_to.alert
alert_object = driver.switch_to.alert
alert_object的方法:
accept():点击确定
dismiss():点击取消
send_keys():如果alert弹窗中有输入框,则可以使用该方法
alert_object的属性:
text:弹出的文本内容
"""
import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
driver = Chrome()
driver.implicitly_wait(10)
# 出现alert弹窗
driver.get(r'D:\pythonProject\web_05day\alert弹窗演示.html')
driver.find_element(By.ID, 'btn').click()
time.sleep(1) # 等1秒钟看效果
# 先切换进入弹窗,再按确认按钮
alert_object = driver.switch_to.alert
alert_object.accept()
# 弹窗上的取消按钮,我这里把它写成了一行
# driver.switch_to.alert.dismiss()
driver.find_element(By.ID, 'user').send_keys("Excellent")
time.sleep(3) # 待3秒后退出
driver.quit()
![](https://img2020.cnblogs.com/blog/1867709/202105/1867709-20210509131629564-1319451992.png)
|