使用Selenium Webdriver选择Dropdown下拉值出现交互异常如何解决
提问内容
自我介绍
两年前我发掘了自己对编程的热爱,编程十分有趣,我非常喜欢!我最开始学习的是VBA,之后转向Python。目前我正在参加Python课程,同时阅读了大量相关资料,如果大家有优质的学习读物推荐,我非常乐意接收。可以看出我在编程领域还是新人。
我的问题
我正在开发一款网页爬虫,需要遍历多个页面采集信息。目前信息采集功能运行正常,但无法切换到下一页。我做了简单的调试也查阅了相关资料,仍旧无法独自解决这个问题,希望能获得帮助。
页面底部有一个用于选择页码的下拉菜单,我遇到的问题就是无法通过该下拉菜单选择对应页面跳转。页面没有直接的下一页跳转入口,只能在下拉菜单中选择页码,下拉菜单的HTML结构如下:
<select name="page" id="page" onchange="getApi('ispagination')"> <option selected="" value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select>
尝试方案1
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select import time driver = webdriver.Safari() driver.get("https://cnft.tools/lunars") time.sleep(2) dropdown = driver.find_element(By.XPATH, '//*[@id="page"]') next_site =driver.find_element(By.XPATH, '//*[@id="page"]/option[2]') print("Element dropdown is visible? " + str(dropdown.is_displayed())) print("Element next_site is visible? " + str(next_site.is_displayed())) print(next_site.text) print(dropdown.text) drp = Select(dropdown) drp.select_by_visible_text("2")
输出结果:
Element dropdown is visible? True Element next_site is visible? True 2 12345678910111213141516171819202122232425262728293031323 Selenium.common.exceptions.ElementNotInteractableException: Message: none
我查阅资料得知该错误通常在元素不可见时触发,但调试结果显示元素是可见的,我也可以成功定位到第2页对应的option元素。
尝试方案2
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains import time driver = webdriver.Safari() driver.get("https://cnft.tools/lunars") time.sleep(2) dropdown = driver.find_element(By.XPATH, '//*[@id="page"]') next_site =driver.find_element(By.XPATH, '//*[@id="page"]/option[2]') print("Element dropdown is visible? " + str(dropdown.is_displayed())) print("Element next_site is visible? " + str(next_site.is_displayed())) print(next_site.text) print(dropdown.text) actions = ActionChains(driver) actions.move_to_element(dropdown).click().perform()
输出结果:
Element dropdown is visible? True Element next_site is visible? True 2 12345678910111213141516171819202122232425262728293031323 selenium.common.exceptions.MoveTargetOutOfBoundsException: Message: None
我查阅资料得知该问题也可能在元素不可见时出现,但检测结果显示元素确实是可见的,请问该如何解决这个问题?
解决方案
问题原因
报错来自两个核心诱因:
- 下拉框位于页面底部,未滚动到视口范围内时,即使
is_displayed()返回True,ActionChains的移动和点击操作也会触发越界错误 - Safari webdriver对原生
<select>标签的Select类操作存在兼容性缺陷,尤其是绑定了自定义onchange事件的场景
最优实现代码
直接通过JS操作元素属性和触发事件,绕过前端交互限制,兼容性更强:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Safari() driver.get("https://cnft.tools/lunars") time.sleep(2) # 定位下拉框元素 dropdown = driver.find_element(By.ID, "page") # 滚动到元素位置,确保在视口范围内 driver.execute_script("arguments[0].scrollIntoView();", dropdown) time.sleep(0.5) # 修改下拉框value为目标页码,手动触发onchange跳转事件 target_page = 2 driver.execute_script(f"arguments[0].value = '{target_page}'; arguments[0].onchange();", dropdown)
补充说明
该方案不需要展开下拉框、点击选项等交互操作,直接修改元素属性触发绑定的跳转逻辑,不会出现交互类异常。如果需要遍历所有页码,只需要循环修改target_page的取值即可。
内容的提问来源于stack exchange,提问作者Biotonne
相关产品推荐
相关产品推荐

