selenium自动化问题总结

一、元素无法获取

1、新开页面

无法对新开的页面进行操作,那就可能是窗口问题,可以通过获取当前窗口url,然后判断是否页面切换道了最新的窗口。

获取当前url:driver.current_url

# 切换到最新的窗口---函数模式
def switch_to_newest_window(driver):
    # 获取当前所有打开的窗口句柄
    windows = driver.window_handles

    # 确保至少有一个新窗口被打开
    if len(windows) > 1:
        # 切换到最新打开的窗口(根据列表顺序,最后一个元素是最近打开的)
        newest_window = windows[-1]
        driver.switch_to.window(newest_window)
    else:
        print("当前只有一个窗口或者没有新的窗口打开。")

#  切换到最新的窗口---普通模式
windows = driver.window_handles
newest_window = windows[-1]
driver.switch_to.window(newest_window)

2、元素未加载完成

Selenium在执行代码时可能会遇到元素尚未完全加载的情况,导致找不到元素。可以尝试使用等待机制,以确保元素加载完成后再进行操作。

2.1 强制等待

单位为,设置多少秒页面就会等待多少秒,这个方法很容易让线程挂掉,使程序抛异常,所以要慎用此方法。

#强制等待5秒
time.sleep(5)

 2.2 显式等待

当等待的条件满足后(一般用来判断需要等待的元素是否加载出来),就继续下一步操作。等不到就一直等,如果在规定的时间之内都没找到,那么就跳出Exception。

from selenium.webdriver.common.by import By
#显式等待模块
from selenium.webdriver.support.ui import WebDriverWait
#显式等待条件
from selenium.webdriver.support import expected_conditions as EC


# 使用显示等待,等待元素可见。10是最长等待时间,1是每1秒去查询对应的元素。until后面跟的等待具体条件,EC是判断条件,检查元素是否存在于页面的 DOM 上。
element = WebDriverWait(driver, 10,1).until(EC.visibility_of_element_located((By.ID, "element_id")))

# 访问和操作元素
element.click()

2.3 隐式等待

一次设置,全局生效。
区别:如果是只需等待页面中的一个元素加载就用显示等待,等待整个网页加载就用隐式等待。

# 隐式等待
driver.implicitly_wait(5)

3、元素选择器有误

使用不正确的选择器定位元素可能导致找不到元素。确保所使用的选择器是准确、唯一且与要查找的实际元素匹配。

4、浏览器窗口太小

如果浏览器窗口太小,可能导致某些元素被隐藏或变得不可见,从而无法通过Selenium找到。确保浏览器窗口足够大,以显示所需的元素。

在Selenium中,可以通过driver.set_window_size(width, height)方法来调整窗口的大小,其中widthheight分别表示窗口的宽度和高度。

以下是一些常见的窗口大小调整操作:

4.1 设置固定大小

可以直接指定宽度和高度的数值来设置窗口的大小。

driver.set_window_size(800, 600)  # 设置窗口大小为800x600像素

4.2 最大化窗口

可以使用driver.maximize_window()方法来最大化当前的窗口。

driver.maximize_window()  # 最大化当前窗口

4.3 设置为全屏

driver.fullscreen_window()  # 将窗口设置为全屏

driver.fullscreen_window()  # 将窗口设置为全屏

5、元素嵌套在iframe或frame中

如果要访问的元素位于嵌套的iframe或frame中,需要先切换到对应的iframe或frame中,然后再查找元素。

# 单层iframe

driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])

driver.switch_to.frame(index)
driver.switch_to.frame("frame_name")
driver.switch_to.frame("frame_id")


# 两层iframe,例如,如果有两个嵌套的iframe,需要先切换到外部iframe,再切换到内部iframe。
driver.switch_to.frame(0)  # 切换到外部iframe
driver.switch_to.frame(0)  # 切换到内部iframe


# 多层,逐层进入
driver.switch_to.frame(driver.find_element(By.CLASS_NAME, 'pay-iframe'))
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="threeDs"]/iframe'))
driver.switch_to.frame(driver.find_element(By.XPATH, '//*[@id="root"]/div/iframe'))

# 退出iframe---------------------------------------------------------------------------
# 切换到主文档,就是第一个html,可以从最内层切换回主层,不需要逐层切换
driver.switch_to.default_content()

# 切换到父层,内层iframe切换回上一层iframe,可以多次使用语句进行逐层切换
driver.switch_to.parent_frame()

6、页面内容动态变化

如果页面上的元素是通过JavaScript或其他方式动态生成或更改的,那么在元素完成动态加载或更改之前,尝试使用Selenium可能会找不到这些元素。为了解决这个问题,可以使用合适的等待机制,等待页面加载完成或元素出现后再进行操作。

js动态加载网页解决方案:

使用 execute_script() 功能,代码如下。注意在find_element(By.XPATH,“path”).click() 的.click(),这个函数要去掉。不然会报错。

button = driver.find_element(By.XPATH,'//*[@id="root"]/div/div/div[1]/div/div/div[3]/div/div/div[2]/div[3]/div/div/div[2]/input')
driver.execute_script("$(arguments[0]).click()",button)

 注意:上述办法仅适用于,JS动态加载 不可交互式元素的 input 点击事件。其他的提示无法找到元素标签的,可以在代码前,添加:time.sleep(你的秒数),前提是要导入time 函数。
或者是 : driver.refresh() #刷新网页/加载网页

 7、浏览器驱动问题

如果使用Selenium的浏览器驱动程序不兼容或版本不匹配,可能导致无法正常获取元素。请确保使用与浏览器和Selenium版本兼容的正确驱动程序。

8、元素位于隐藏的元素或弹出框内

有些元素可能位于其他元素的内部或弹出框中,这会导致无法直接访问。在这种情况下,可以使用Selenium的相关方法来处理内嵌元素或处理弹出框后再查找所需元素。

8.1 显示隐藏的元素

 如果元素是通过CSS属性或脚本动态设置为隐藏,可以使用JavaScript来更改元素的属性,使其显示出来。然后就可以正常访问和操作元素了。

element = driver.find_element_by_id("element_id")
driver.execute_script("arguments[0].style.display = 'block';", element)

8.2 处理弹出框

如果元素位于弹出框中,需要先切换到弹出框的上下文,然后才能访问和操作其中的元素。可以使用driver.switch_to.alert方法来处理弹出框。在弹出框处理完之后,需要切换回主页面的上下文。

# 切换到弹出框的上下文
alert = driver.switch_to.alert

# 执行弹出框相关操作代码
alert.accept()  # 确认弹出框

# 切换回主页面的上下文
driver.switch_to.default_content()

  • 29
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值