关于selenium操作网课页面时点击事件的小问题

问题出在一个小小的点击事件上
我要操作的是一个可滚动的网课页面,我称之为初始页面

img

而我的逻辑是:先用selenium模拟鼠标滚动,通过class_name把可滚动页面的所有课程作为元素爬取进列表里(并且我写了个去重的方法)

for i in range(13):#课程设置为13是因为只需要滚动13次就能让13节课依次进入可视范围
    web.execute_script("window.scrollBy(0,250);")
    time.sleep(0.25)
    classAA2=classAA2+web.find_elements_by_class_name("resource-left-2aDnK")

接着新建一个初始页面,并且慢慢滚动,根据列表的下标对之前爬取的课程元素进行点击
(由于它进入课程是在原来的标签页上完成的,为了让多节课程同时播放,我在for循环建立新的标签页并打开初始页面)

web.execute_script(f"window.open('{url}','_blank');")
web.switch_to.window(web.window_handles[-1])

然而,每次运行到第二次循环,即要点开第二节课的时候,总是会报click方法的错误
虽然这个程序因为chromedriver的版本问题偶尔报错,但主要报错在于selenium的click方法,应该是没有点击到目标。

Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/自动化网课/3.py", line 108, in <module>
    classAA3[b].click()

我确确实实用web.switch_to方法切换到了正确的页面,滚动也生效了,但偏偏问题从第二次点击事件开始出现
一开始我以为是列表中爬取的课程元素对应不上新建页面中的课程元素,然后我把新旧页面的课程都爬了下来进行对比,发现两者是一样的,可以对应得上
我推测是滚动的问题,有什么滚动方法推荐吗?

【以下回答由 GPT 生成】

根据你提供的信息,问题出现在第二次点击操作上。你已经确认了页面切换和滚动是成功的,并且课程元素列表也是正确的。那么可能问题出在继续点击时,页面还没有完全加载完毕导致无法定位到元素。

你可以尝试使用WebDriverWait等待页面加载完成后再进行点击操作。下面是一个可能的解决方案:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# ...

for i in range(13):
    web.execute_script("window.scrollBy(0,250);")
    time.sleep(0.25)
    classAA2 = classAA2 + web.find_elements_by_class_name("resource-left-2aDnK")

web.execute_script(f"window.open('{url}','_blank');")
web.switch_to.window(web.window_handles[-1])

# 加入等待页面加载完成
wait = WebDriverWait(web, 10) # 等待时间设为10秒,可以根据实际情况进行调整
element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "your-element-class"))) # 替换成你要点击的元素的class name

element.click()

这里使用WebDriverWait结合expected_conditions类来等待元素可以点击,element_to_be_clickable表示元素在页面中可以点击。需要修改代码中的"class name"为你要点击元素的正确class名字。

如果这个解决方案不能解决你的问题,可能需要进一步调查错误信息和查看其他可能的原因。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^