如何用Selenium点击WordPress后台仅含类选择器的菜单元素
问题概述
需要用Selenium实现自动化流程,给WordPress后台的非主页导入8个Elementor区块,目前已完成登录代码,但无法定位并点击仅包含类标识的WordPress菜单。
当前代码
import time from selenium import webdriver from selenium.webdriver.safari.service import Service #from selenium.webdriver.safari.options import SafariOptions #from webdriver_manager.safari import SafariDriverManager from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC #options = SafariOptions() #options.add_experimental browser = webdriver.Safari() browser.get('http://akaska.hledampneu.cz/wp-admin') time.sleep(1) Passname = browser.find_element(By.ID,"user_login") #Passname = browser.find_element(by=id("user_login")) Passname.send_keys('admin.akaska') Password = browser.find_element(By.ID, "user_pass") Password.send_keys('tdYFxncD9gbd6Q)Y*2') time.sleep(1) submit = browser.find_element(By.ID,"wp-submit").click() #submit = browser.find_element(By.CLASS_NAME,"icon-options") time.sleep(1) #submit = browser.find_element(By.ID,"wp-admin-bar-site-name") submit = browser.find_element(By.CSS_SELECTOR, 'span[class="ab-item"]').click()
已尝试方案及报错
- CSS_SELECTOR定位
submit = browser.find_element(By.CSS_SELECTOR, 'span[class="ab-item"]').click()
报错:
Traceback (most recent call last): File "/Users/justin/Desktop/projects/wordpressAutomation /main.py", line 36, in <module> submit = browser.find_element(By.CSS_SELECTOR, 'span[class="ab-item"]').click() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 741, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 347, in execute self.error_handler.check_response(response) File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: ; 找不到元素异常
- CLASS_NAME定位
submit = browser.find_element(By.CLASS_NAME,"ab-item").click()
报错:
Traceback (most recent call last): File "/Users/justin/Desktop/projects/wordpressAutomation /main.py", line 34, in <module> submit = browser.find_element(By.CLASS_NAME,"ab-item").click() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 741, in find_element return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 347, in execute self.error_handler.check_response(response) File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: ; 找不到元素异常
解决办法
出现找不到元素的问题,可从以下几个方向排查解决:
- 替换固定等待为显式等待
固定的time.sleep()无法保证元素加载完成,改用Selenium的显式等待,确保元素存在且可点击:
# 删除原来的time.sleep(1),替换为以下代码 WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.ab-item')) ).click()
- 优化定位器精度
ab-item类可能在页面中重复出现,结合父元素的唯一标识缩小范围,比如WordPress顶部导航的站点名称菜单:
WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#wp-admin-bar-site-name span.ab-item')) ).click()
- 检查是否存在iframe嵌套
如果菜单元素在iframe内,需要先切换到对应的iframe再定位:
# 替换为实际的iframe定位方式,比如id或class iframe = browser.find_element(By.ID, '目标iframe的ID') browser.switch_to.frame(iframe) # 定位并点击元素 WebDriverWait(browser, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.ab-item')) ).click() # 操作完成后切回主文档 browser.switch_to.default_content()
- 使用JS强制点击
若元素存在但因样式覆盖无法点击,可通过JavaScript强制触发点击:
element = WebDriverWait(browser, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'span.ab-item')) ) browser.execute_script("arguments[0].click();", element)
内容的提问来源于stack exchange,提问作者Justin
相关产品推荐
相关产品推荐

