Selenium 4 find_element_by_css_selector失效问题及元素定位咨询
Selenium CSS选择器使用问题解答
1. CSS选择器语法合法性说明
你提到的几种写法均为合法写法,对应规则如下:
- 定位方法层面:
driver.find_element_by_css_selector()是Selenium 3及更早版本的原生API,driver.find_element(By.CSS_SELECTOR, 选择器)是Selenium 4及后续版本推荐的统一写法,只要和你使用的Selenium版本匹配,两种写法都可以正常运行。 - 选择器规则层面:
- HTML标签前缀不是必填项:加标签前缀是为了限定匹配范围,比如
a.nav#home只会匹配标签为<a>、类包含nav、ID为home的元素,不加前缀的话会匹配所有符合后续规则的元素,可根据实际定位需求选择是否添加。 #符号不是必填项:#是ID选择器的专属标识,仅当你需要通过元素的ID属性定位时才需要使用。如果是通过标签名、类名、自定义属性定位,不需要加#,比如h1是直接匹配所有<h1>标签元素,.btn是匹配所有类属性包含btn的元素。
- HTML标签前缀不是必填项:加标签前缀是为了限定匹配范围,比如
2. arizonarealestate.com搜索框定位修正方案
你原有代码的定位失败主要有两个原因:一是选择器规则写错,二是没有等待页面元素渲染完成就执行定位操作。修正后的可运行代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC try: driver = webdriver.Chrome() driver.get("https://www.arizonarealestate.com") # 最多等待10秒,直到搜索框加载完成 wait = WebDriverWait(driver, 10) # 搜索框定位:通过placeholder属性匹配 searchBox = wait.until(EC.presence_of_element_located( (By.CSS_SELECTOR, "input[placeholder='Enter city, address, neighborhood, zip, or MLS #']") )) searchBox.send_keys("Some text") # 搜索按钮定位:通过类属性组合匹配 searchBtn = wait.until(EC.element_to_be_clickable( (By.CSS_SELECTOR, "button.btn.btn-primary.btn-lg.btn-block.js-qs-btn") )).click() finally: driver.quit()
修正点说明:
- 移除了原代码中错误的
#input、#.等不符合CSS选择器规则的写法 - 新增了显式等待逻辑,避免页面未加载完成导致的定位失败
- 搜索按钮的选择器去掉了错误的
#标识,直接通过类属性组合匹配即可
内容的提问来源于stack exchange,提问作者GwezaKwer
相关产品推荐
相关产品推荐

