如何使用Selenium 4.8根据文本定位按钮(LinkedIn自动化场景)
解决LinkedIn联系人请求自动化的按钮定位问题
我用Python+Selenium自动化LinkedIn加好友功能,卡在了「添加联系人」环节——不知道怎么根据按钮的可见文本定位元素。试了好几种方法都没用,参考的教程也没给正确语法。
已尝试的无效代码
all_buttons = Select.select_by_visible_text('Suivre') #all_buttons = driver.find_element(by=By.XPATH, value="//button[@text='Suivre']") # driver.find_element(By.XPATH, '//button[text()="Some text"]') # all_buttons = driver.find_elements_by_tag_name("button")
目标按钮的HTML代码
<button aria-label="Invitez XYZ à rejoindre votre réseau" id="ember369" class="artdeco-button artdeco-button--2 artdeco-button--secondary ember-view"><!----> <span class="artdeco-button__text"> Se connecter </span></button> <!----> <!---->
当前完整代码(无法正常运行)
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import Select import time ser = Service(ChromeDriverManager().install()) browser = webdriver.Chrome(service=ser) url='https://www.google.com' browser.get(url) driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get('https://www.linkedin.com') time.sleep(2) #LOG IN username = driver.find_element(by=By.XPATH, value="//input[@name='session_key']") password = driver.find_element(by=By.XPATH, value="//input[@name='session_password']") username.send_keys('MY EMAIL') password.send_keys('MY PASSWORD') time.sleep(2) submit = driver.find_element(by=By.XPATH, value="//button[@type='submit']").click() time.sleep(5) # ADD CONTACTS driver.get("https://www.linkedin.com/search/results/people/?sid=0tK") time.sleep(5) all_buttons = driver.find_element(By.XPATH, "//button[text()='Se connecter']") connect_buttons = [btn for btn in all_buttons] for btn in connect_buttons: btn.click()
问题分析与修正方案
1. 按钮文本的定位逻辑错误
目标按钮的可见文本Se connecter并不是直接在<button>标签内,而是嵌套在子标签<span class="artdeco-button__text">里。同时文本包含换行和空格,直接用text()匹配会失败,需要用normalize-space()处理空格。
正确的XPath定位方式:
# 匹配所有包含目标文本的按钮 all_buttons = driver.find_elements(By.XPATH, "//span[normalize-space(text())='Se connecter']/parent::button")
2. 错误使用API
Select类仅用于处理下拉选择框,不能用来定位普通按钮,完全不适用当前场景。driver.find_elements_by_tag_name是旧版API,建议使用新版的driver.find_elements(By.TAG_NAME, "button")。
3. 代码其他冗余/错误点
- 初始化了两个浏览器实例(
browser和driver),完全多余,保留一个即可。 driver.find_element只会返回单个元素,遍历会报错,必须用driver.find_elements获取所有匹配元素。- 硬编码
time.sleep()稳定性差,改用显式等待(WebDriverWait)能更可靠地等待元素加载完成。
修正后的完整代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化单个浏览器实例 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) wait = WebDriverWait(driver, 10) # 登录LinkedIn driver.get('https://www.linkedin.com') # 显式等待用户名输入框加载 username = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='session_key']"))) password = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='session_password']"))) username.send_keys('MY EMAIL') password.send_keys('MY PASSWORD') # 等待登录按钮并点击 submit_btn = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))) submit_btn.click() # 进入搜索结果页面 driver.get("https://www.linkedin.com/search/results/people/?sid=0tK") # 等待所有"Se connecter"按钮加载完成 connect_buttons = wait.until(EC.presence_of_all_elements_located( (By.XPATH, "//span[normalize-space(text())='Se connecter']/parent::button") )) # 遍历点击按钮(注意LinkedIn有频率限制,避免触发反爬) for btn in connect_buttons: try: btn.click() time.sleep(2) # 适当延迟避免过快操作 except Exception as e: print(f"点击按钮失败: {e}") continue
内容的提问来源于stack exchange,提问作者A.Tshi
相关产品推荐
相关产品推荐

