selenium页面切换操作

selenuim页面切换

webdriver只能在一个页面里对元素进行识别和定位。如果有多个页面操作的时候,要先进行页面切换。

切换分两种

1 iframe内嵌页面切换(框架集切换)


# 1 获取iframe标签

iframe = driver.find_element_by_tag_name('iframe')

# 2 切换代码

driver.switch_to.frame(iframe)

# 操作iframe标签元素

user_input = driver.find_element_by_xpath('//*[@id="q"]')

user_input.send_keys('你好,测牛')

# 切换回页面

driver.switch_to.default_content()

h1 = driver.find_element_by_id('h1')

总结:

1》 切换iframe用的是driver.switch_to.frame(xxx) xxx是获取iframe标签,可以通过id或者tagname等

2 》切换回来用的是 driver.switch_to.default_content()

2 窗口切换

handle=driver.window_handles 以列表的形式返回,默认是找到页面的所有句柄

列表中最后一项目是最新打开的页面的句柄。

driver.switch_to.window(handle[-1]) 括号里要写页面句柄

注意:

操作完当前页面,如果要回到主页面,还要再次切换回去才能操作

driver.switch_to.window(handle[0])

不能使用default_content,这个只针对iframe页面使用。

实例代码:


from selenium import webdriver

import os

import time

driver = webdriver.Chrome()

driver.implicitly_wait(15)

url = os.path.abspath('index3.html')

driver.get(url)

# 1 获取a标签,点击跳转新页面

link = driver.find_element_by_id('a')

link.click()

# 2 切换新页面

handle=driver.window_handles

driver.switch_to.window(handle[-1])

driver.implicitly_wait(5)

user_input = driver.find_element_by_id('kw')

user_input.send_keys('你好')

time.sleep(3)

# 关闭当前标签页

driver.close()

# 切换到默认页

driver.switch_to.window(handle[0])

print(link.text)

driver.quit()

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

在使用 Selenium 进行页面切换时,如果遇到无法定位元素的问题,可能是由多种原因导致的。以下是几种常见的解决方法,涵盖 iframe 切换页面加载延迟、元素遮挡和窗口大小等方面: ### 1. 检查是否需要切换 iframe 当页面中包含嵌套的 iframe 时,Selenium 默认处于主文档上下文中,无法直接定位 iframe 中的元素。此时需要使用 `switch_to.frame()` 方法切换到对应的 iframe 中。例如: ```python driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'myframe')]")) ``` 如果当前处于某个子 iframe 中,并希望切换回父 iframe,可以使用: ```python driver.switch_to.parent_frame() ``` 切换完成后,就可以在对应的 iframe 上下文中定位元素了 [^5]。 ### 2. 等待页面加载完成 有时页面加载速度较慢,导致 Selenium 在元素还未加载完成时尝试定位,从而引发 `NoSuchElementException` 异常。可以通过显式等待(`WebDriverWait`)来确保元素加载完成后再进行操作。例如: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待元素出现 wait = WebDriverWait(driver, 10) element = wait.until(EC.presence_of_element_located((By.LINK_TEXT, '基本版'))) element.click() ``` 显式等待可以确保页面元素在操作前已经加载完成,从而避免因加载速度导致的定位失败 [^4]。 ### 3. 检查元素是否被遮挡或不可见 如果元素虽然存在于页面中,但被其他元素遮挡或处于不可见状态(如 `display: none` 或 `visibility: hidden`),也会导致定位失败或操作无效。可以通过以下方式检查: - **最大化浏览器窗口**:有时页面布局会因窗口大小变化而调整,导致某些元素被遮挡,可以通过最大化窗口来避免这种情况: ```python driver.maximize_window() ``` - **判断元素是否可见**:使用 `.is_displayed()` 方法检查元素是否可见: ```python element = driver.find_element(By.ID, "element_id") if element.is_displayed(): element.click() ``` - **判断元素是否可用**:使用 `.is_enabled()` 方法检查元素是否可交互(未被禁用): ```python if element.is_enabled(): element.click() ``` 这些方法可以帮助识别因布局或样式问题导致的元素不可见或不可操作问题 [^3]。 ### 4. 检查页面切换是否成功 页面切换后,Selenium 的上下文仍然可能停留在原页面,导致无法定位新页面上的元素。可以使用 `window_handles` 获取当前所有窗口句柄,并切换到最新打开的窗口: ```python # 获取当前所有窗口句柄 handles = driver.window_handles # 切换到最新打开的窗口 driver.switch_to.window(handles[-1]) ``` 确认当前窗口是否为目标页面后,再进行元素定位 [^1]。 ### 5. 检查元素是否存在或是否被动态修改 有时页面元素是通过 JavaScript 动态加载的,或者由于业务逻辑导致元素在特定条件下不存在。可以通过以下方式排查: - **确认元素是否存在**:使用 `find_elements` 而不是 `find_element` 来判断元素是否存在: ```python elements = driver.find_elements(By.LINK_TEXT, '基本版') if len(elements) > 0: elements[0].click() ``` - **检查 DOM 结构**:通过浏览器的开发者工具查看当前页面的 HTML 结构,确认目标元素是否确实存在,并检查其属性是否发生变化(如 `id`、`class` 等)。 如果元素确实不存在或被动态修改,可能是页面逻辑问题,需要与开发人员沟通确认 [^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值