最新消息:本站所有跳转向bbs.ykit.cn的附件将全面停止,附件已转移到https://www.qingsj.com

Python+selenium iframe表单和多窗口切换

Python 有客 650浏览
iframe表单
在Web应用遇到frame/iframe表单嵌套页面通过webdriver的switch_to.frame()和switch_to.parent_content切入和跳出frame表单

driver.switch_to.frame(driver.find_element_by_xpath("xpath"))      # 通过定位方式切入iframe表单

driver.switch_to.frame(0)                                                                 # 通过iframe的索引切入 iframe表单

driver.switch_to.frame('id value')                                                     # 通过iframe的id切换入frame表单

driver.switch_to.frame('name')                                                        # 通过iframe的name切入iframe表单

driver.switch_to.parent_comtent()                                                  # 跳出当前一级表单

driver.switch_to.default_content()                                                  # 跳回最外层页面

注:switch_to.frame()默认取表单的id和name属性,没有id和name可以通过iframe表单的索引和iframe标签的定位方式来切入

浏览器窗口切换
获取当前窗口句柄:handle = driver.current_window_handle

获取所有窗口句柄:all_handle = driver.window_handles

通过句柄切换窗口:driver.switch_to.handle(handle)

获取当前所有打开的窗口句柄返回的为一个列表,可以通过遍历循环和列表索引获取对应的handle

注:获取当前打开的所有窗口handle的列表是按窗口的打开顺序排列而不是获取handle时窗口的序列顺序排列

#!/usr/bin/python3
# coding=utf-8
from selenium import webdriver
def test_handle():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.ykit.cn")
    home_handle = driver.current_window_handle                              # 获取百度首页handle
    driver.find_element_by_xpath("//*[@id='lg']/map/area").click()
    driver.switch_to.window(home_handle)                                    # 通过handle值切换回百度首页
    driver.find_element_by_xpath("//input[@id='kw']").send_keys("selenium")
    driver.find_element_by_xpath("//input[@id='su']").click()
    driver.find_element_by_xpath("//*[@id='con-ar']/div[1]/div/div/div[2]/div[1]/div[1]").click()
    all_handle = driver.window_handles                                      # 获取所有打开的窗口的handles
    driver.switch_to.window(all_handle[1])                                  # 切换到百度今日新鲜事
    print(driver.title)
    driver.switch_to.window(all_handle[2])                                  # 切换到百度翻译
    print(driver.title)
    driver.switch_to.window(all_handle[0])                                  # 切换到百度首页
    print(driver.title)
    driver.quit()
    
test_handle()
js处理多窗口
将链接的target属性删除或者value设置为空,在点击就不会打开新窗口了,以CSDN首页博客按钮为例:
# coding=utf-8
# author:Ven
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.get("https://www.ykit.cn/")
driver.maximize_window()
js_target = 'document.getElementsByClassName("active")[0].target="";'
# 定位class="active"的一组元素,取列表中索引为0的元素将其的target属性的value设置为空
driver.execute_script(js_target)
driver.find_element_by_xpath("//a[@href='//www.ykit.cn/']").click()
driver.quit()

转载请注明:有客帮 » Python+selenium iframe表单和多窗口切换