使用Selenium自动化LinkedIn时关闭聊天窗口失败的技术求助
问题
首次使用Selenium实现LinkedIn自动发送消息功能,卡在关闭聊天窗口环节,无法定位关闭触发元素,执行代码时抛出JavascriptException错误,错误信息为javascript error: arguments[0].click is not a function。
相关代码:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By import time driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get("https://linkedin.com") time.sleep(2) 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("hr@unitedmerchant.com") password.send_keys("UMSUpos2022") time.sleep(2) submit = driver.find_element(by=By.XPATH, value="//button[@type='submit']").click() time.sleep(2) import random n_pages = 3 for n in range(1, n_pages + 1): driver.get("https://www.linkedin.com/search/results/people/?network=%5B%22F%22%5D&origin=FACETED_SEARCH&page=" + str(n)) time.sleep(2) all_buttons = driver.find_elements(By.TAG_NAME, 'button') message_buttons = [btn for btn in all_buttons if btn.text == "Message"] for i in range(2, 3): #click on "Message" button driver.execute_script("arguments[0].click();", message_buttons[i]) time.sleep(2) #activate main div main_div = driver.find_element(by=By.XPATH, value="//div[starts-with(@class, 'msg-form__msg-content-container')]") driver.execute_script("arguments[0].click();", main_div) #type message paragraphs = driver.find_elements(By.TAG_NAME, 'p') all_span = driver.find_elements(By.TAG_NAME, 'span') all_span = [s for s in all_span if s.get_attribute("aria-hidden") == "true"] idx = [*range(3,23,2)] greetings = ["Hello", "Hi", "Hey"] all_names = [] for j in idx: name = all_span[j].text.split(" ")[0] all_names.append(name) greetings_idx = random.randint(0, len(greetings)-1) message = greetings[greetings_idx] + " " + all_names[i] + ", Sorry, I didn't mean to bother you, I'm just tesing a Linkedin capabilities... My apologies!:) This is not Bluu, this message is automated." paragraphs[-5].send_keys(message) time.sleep(2) #send message submit = driver.find_element(by=By.XPATH, value="//button[@type='submit']").click() time.sleep(2) #close div close_button = driver.find_elements(By.CLASS_NAME, 'msg-overlay-bubble-header__control') driver.execute_script("arguments[0].click();", close_button) time.sleep(2)
错误栈:
--------------------------------------------------------------------------- JavascriptException Traceback (most recent call last) Input In [19], in <cell line: 5>() 46 #close div 47 close_button = driver.find_elements(By.CLASS_NAME, 'msg-overlay-bubble-header__control') ---> 48 driver.execute_script("arguments[0].click();", close_button) 49 time.sleep(2) JavascriptException: Message: javascript error: arguments[0].click is not a function (Session info: chrome=105.0.5195.128)
解决方案
问题原因
你使用driver.find_elements()获取关闭按钮,这个方法返回的是元素列表,而非单个元素。当把列表传入execute_script时,arguments[0]是数组类型,数组没有.click()方法,因此触发报错。
修复方法
1. 修正元素获取方式
将find_elements改为find_element,获取单个关闭按钮元素:
close_button = driver.find_element(By.CLASS_NAME, 'msg-overlay-bubble-header__control')
2. 更精准的定位(推荐)
LinkedIn聊天窗口的关闭按钮带有明确的aria-label属性,用XPATH定位可避免匹配到同class的其他元素:
# 等待元素加载完成再操作,替代time.sleep提升稳定性 close_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Close chat']")) )
3. 替换点击方式
直接使用Selenium原生的.click()方法,比execute_script更稳定可靠:
close_button.click()
修复后的完整关闭代码段
# 等待关闭按钮可点击后点击 close_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='Close chat']")) ) close_button.click() time.sleep(2)
额外建议
- 尽量用
WebDriverWait替代time.sleep(),根据页面实际加载状态等待,提升代码稳定性。 - LinkedIn反爬机制严格,频繁自动化操作可能触发账号限制,建议添加合理延迟,避免短时间内批量操作。
内容的提问来源于stack exchange,提问作者Globean
相关产品推荐
相关产品推荐

