Selenium+python,在新的页面(新打开的web页面)上没法定位元素问题解决方案。

本文介绍了在使用Selenium进行Web端自动化测试时遇到的跨域问题及解决方案,包括通过句柄切换来定位新打开页面的元素,以及采用独立测试用例的方法。

问题描述

在做web端自动化时,因为页面涉及跨域的问题,所以重新打开了页面,但是在执行代码时,提示selenium.common.exceptions.NoSuchElementException 这就很奇怪了,明明是用ID的方式定位的,这么稳的定位方式找不到,肯定是因为打开了新页面的问题。

问题分析

在新开的页面中找不到元素,也就意味着当前操作范围变化了,也就是句柄可能出了问题,能操作的范围还在上一个页面中,所以要想办法到新开的页面去操作。

问题解决

既然是句柄有问题,那就首先考虑去看API文档,查看怎么操作句柄,最不济总有个查看句柄的办法。果然webdriver给我们提供了driver.window_handles 来查看句柄。好那先输出一波

num = init.d.window_handles # 获取当前页句柄
print(num)

输出的结果为

['4294967297', '4294967302']

也就意味着,我们当前在num[0]中进行操作,但是页面打开后,要在num[1]中查找元素,这当然就找不到,
不慌 ,问题不大,再找找API,看看有没有切换句柄的方式,肯定是有的。

driver.switch_to.window(num[1]) # 在句柄2 上执行下述步骤

好了,你现在就能再继续操作你的元素了。

第二种思路

既然页面都跳转了,那就最好再写多一个tesecase 保证用例的可复用性,那么这个时候就可以使用

def_test_2_**(self):
    driver.get('http://****/addbook')
    driver.find_element_by_id('subject21').click()

直接get后,相当于直接就结束了前一个页面的操作,重新进执行,然后执行新的testcase ,岂不是美滋滋?

当你使用 Selenium 进行自动化测试时遇到类似“网页似乎有问题,或者可能已永久移动到新的 Web 地址”的报错提示,这通常意味着请求的页面无法正常加载或发生了重定向问题。以下是一些常见的原因及解决方法: ### 可能的原因 1. **URL 错误**: - 检查你提供的 URL 是否有拼写错误或者是无效链接。 2. **网络连接不稳定**: - 确保你的本地环境能够稳定地访问互联网,并且目标网站是可以访问的状态。 3. **页面已经搬迁或删除**: - 如果该页面确实已经被移到了其他地址,则需要更你的脚本以指向正确的网址;如果已被移除则需确认是否有替代资源可用。 4. **服务器端限制(例如 IP 封禁、UA 校验等)**: - 部分站点会对爬虫采取防御措施如封IP、检查 User-Agent 字段,这时你可以尝试修改 WebDriver 的配置使其更像普通浏览器的行为。 5. **Selenium 版本兼容性**: - 当前使用的版本是否支持所操作的目标浏览器及其对应的驱动程序? 6. **等待时间不足**: - 页面未完全加载完成就开始查找元素可能导致异常情况发生。可以适当增加隐式等待时间和显式条件判断确保页面充分渲染后再继续后续动作。 7. **JavaScript 加载失败或其他前端因素干扰**: - 对于某些依赖大量JS动态生成内容的情况,可能存在加载超时或者其他阻止 JS 执行的因素影响最终呈现效果。 8. **HTTPS/TLS 握手失败问题** - SSL证书过期、自签名等原因也可能造成此类现象,在这种情形下应当查看具体的日志信息并排查相应的问题点所在。 针对上述提到的各种可能性,建议首先从最简单直接的地方入手——核实 URL 和网络状况,然后再逐步深入探究其它潜在的技术细节方面的影响因子。 ### 解决方案示例代码片段 (Python) ```python from selenium import webdriver import time # 设置选项避免检测为webdriver模式 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=chrome_options) try: driver.get("https://example.com") # 替换为目标网址 # 显示等待直到某个特定元素出现为止,默认最长等候时间为 10 秒钟 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, timeout=10).until( EC.presence_of_element_located((By.ID, "some-element-id")) ) finally: print("Page loaded successfully.") # 让窗口保持打开状态以便观察结果一段时间后关闭它 time.sleep(5) driver.quit() ``` 此外,为了更好地定位和解决问题,最好能够在出错时捕获完整的堆栈跟踪以及尽可能详细的上下文数据(比如截图、源码快照等等),这样可以帮助更快找到根本原因并予以修复。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值