Python自动化轮播控件中元素not clickable报错处理

问题:

想要进行依次点击专题栏中的链接. 下方是一个轮播条.
在点击A中第二篇文章时, 报错 . is not clickable at point (481, 343). Other element would re
ceive the click:
在这里插入图片描述

思路1:

判断为轮播抢走了浏览器焦点. 导致点击失败. 获取一个固定的元素, 这里获取了专题栏的title元素. 在每次点击文章前, 先执行下点击专题栏标题操作, 抢回焦点. 问题解决.

思路2:

禁用JS

option = webdriver.ChromeOptions()
prefs = {'profile.managed_default_content_settings.javascript': 2}
option.add_experimental_option('prefs', prefs)
context.driver = webdriver.Chrome(chrome_options=option)

以上方法都无法保证解决问题, 只能根据具体问题分析寻找方案

最终解决方案:

在这里插入图片描述
比如想要依次点击所有新闻栏中的文章.
1.点击新闻栏title
2.获取新闻栏下所有文章a标签元素
3.把a标签列表抽取成包含这些元素href地址的列表
4.测试href列表

    articles = pg_homepage.get_law_articles
    article_url_list = [article.get_attribute('href') for article in articles]
    article_name_list = [article.get_attribute('titletip') for article in articles]
    list_count = [x for x in range(len(article_url_list))]
    for i in list_count:
        pg_homepage.visit(article_url_list[i])
        pg_homepage.verify_click_article(article_name_list[i])
<think>好的,用户想了解Python Selenium中的元素等待方法,特别是显性等待和隐性等待。我需要根据提供的引用资料来组织回答。 首先,回忆一下隐性等待(Implicit Wait)。根据引用[1],隐性等待会让WebDriver等待一定时间再去查找元素,这个时间是全局设置的,适用于整个会话。需要说明它的用法和特点,比如driver.implicitly_wait(10),并且提到它只影响元素查找,不会影响其他操作。同时,引用[3]提到隐性等待和显性等待同时存在时,最长等待时间取两者中的较大者,这点很重要,需要强调。 然后是显性等待(Explicit Wait)。引用[1]和[2]提到显性等待使用WebDriverWait和expected_conditions,需要导入相应的模块。要给出代码示例,比如WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'someId')))。还要说明显性等待的优势,比如可以自定义等待条件和轮询间隔,更灵活。引用[4]提到可以使用expected_conditions模块的各种条件,或者WebElement的方法如is_displayed(),所以需要列举一些常用的条件,如元素可见、可点击等。 另外,引用[3]中的代码示例展示了until_not的用法,可以提到显性等待不仅可以等待条件成立,还可以等待条件不成立的情况。同时要指出显性等待和隐性等待的联合使用时的注意事项,比如最长等待时间取决于两者中的较大者,避免用户混淆。 需要将两者进行对比,说明各自的适用场景。隐性等待适合全局设置,而显性等待适合特定条件下的等待。同时提醒用户隐性等待可能会影响整个测试的执行时间,特别是在元素不存在的情况下,而显性等待可以更精确控制等待时间,提高测试效率。 最后,根据用户提供的示例,生成相关问题。问题可以涉及两种等待的区别、如何选择、显性等待的具体条件以及同时使用的注意事项等。要确保问题覆盖回答中的关键点,帮助用户进一步学习。 检查是否所有数学公式都正确使用了$...$或$$...$$格式,但在这个问题中可能不需要数学公式。不过要注意代码块的正确格式,使用三个反引号包裹,并标明语言类型。确保引用标识正确添加,比如在提到隐性等待和显性等待的定义时,引用[1]和[2],提到联合使用时引用[3],提到条件方法时引用[4]。 总结回答结构:先介绍两种等待方法,分别说明其语法、特点和使用场景,然后对比两者的区别和联合使用时的注意事项,最后给出相关问题。确保语言简洁明了,符合中文表达习惯。</think>### Python Selenium 元素等待方法详解 在自动化测试中,元素加载时间的不确定性会导致脚本执行失败。Selenium 提供了两种等待机制:**隐性等待**和**显性等待**,用于处理动态加载元素的场景。 --- #### 1. 隐性等待 (Implicit Wait) 隐性等待是全局性设置,作用于整个 `WebDriver` 会话周期。通过 `driver.implicitly_wait(time)` 设置最长等待时间,若元素未立即找到,WebDriver 会轮询 DOM 直到超时或找到元素[^1][^3]。 **特点**: - 仅针对元素查找操作(如 `find_element`)生效,不影响其他操作(如页面加载)。 - 超时后抛出 `NoSuchElementException`。 **示例**: ```python driver.implicitly_wait(10) # 设置全局隐性等待时间为10秒 element = driver.find_element(By.ID, "button") ``` --- #### 2. 显性等待 (Explicit Wait) 显性等待针对特定条件,通过 `WebDriverWait` 和 `expected_conditions` 模块实现更灵活的等待逻辑[^2][^4]。 **语法**: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "button")) ) ``` **特点**: - 支持自定义条件(如元素可见、可点击、属性变化等)。 - 可设置轮询间隔(默认 0.5 秒),优化性能[^3]。 **常用条件**: - `EC.presence_of_element_located`(元素存在) - `EC.visibility_of_element_located`(元素可见) - `EC.element_to_be_clickable`(元素可点击) - `EC.text_to_be_present_in_element`(元素包含特定文本) --- #### 3. 隐性等待 vs 显性等待 | 特性 | 隐性等待 | 显性等待 | |--------------------|--------------------------|--------------------------| | **作用范围** | 全局 | 局部(针对特定条件) | | **灵活性** | 低 | 高(可自定义条件) | | **超时处理** | 抛出异常 | 抛出异常或返回布尔值 | | **性能影响** | 可能增加总执行时间 | 更高效(按需等待) | **联合使用注意事项**: 若同时设置两种等待,实际最长等待时间取两者中的较大值。例如: ```python driver.implicitly_wait(5) # 隐性等待5秒 element = WebDriverWait(driver, 10).until(EC.visibility_of_element_located(...)) # 最终最长等待时间为10秒 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值