【selenium】網頁元素找不到?從$(‘[placeholder=“手機號“]‘)說起

網頁元素找不到?從$(‘[placeholder=“手機號”]’)說起

總結:控制臺不騙人,元素選不到,八成是寫法、時機或環境的問題。

我們在寫網頁自動化腳本或者調試頁面的時候,經常遇到一個讓人頭疼的問題:明明元素就在眼前,但代碼就是找不到它。就像下面這段代碼:

$("[placeholder="手機號"]")

你會發現,它根本不起作用。這篇文章將幫你徹底搞清楚為什么會發生這種情況,以及如何系統性地排查和解決它。


一、元素找不到的全景圖

遇到元素找不到的問題,你可以遵循下圖的路徑快速定位問題所在:

返回Null
返回Element
undefined
function
No
Yes
元素選擇代碼執行失敗
控制臺輸入
document.querySelector(...)
元素不存在
頁面未加載完成
元素在iframe內
選擇器寫錯
元素存在
控制臺輸入
typeof $
頁面未引入jQuery
需手動引入或改用原生JS
$ === jQuery ?
$被占用
可能是瀏覽器控制臺快捷方式或其他庫
jQuery已加載
可用$()正常操作

二、為什么 $(...) 這種寫法會失敗?

在瀏覽器控制器寫 $("[placeholder="手機號"]") 之所以無效,主要原因有三個:

問題點說明正確寫法舉例
$(...) 不是有效函數瀏覽器原生 JS 或 jQuery 中都沒有 $() 這個函數。document.querySelector()$() (如果 jQuery 已加載)
引號嵌套錯誤字符串內部再用相同引號會導致解析錯誤。使用單雙引號交替:'[placeholder="手機號/用戶名"]'
選擇器語法不完整屬性選擇器必須完整地寫在方括號 [] 內。input[placeholder="手機號/用戶名"]

三、終極排查指南:從入門到精通

當你的選擇器不起作用時,別再“盲猜”了。請按照以下步驟,在瀏覽器控制臺(F12)里一步步操作,讓真相自己浮現。

第一步:檢查元素是否存在

目的: 確認你要找的元素是否真的在當前的 DOM 樹中。

操作: 在控制臺輸入:

document.querySelector('[placeholder="手機號/用戶名"]')
結果含義后續動作
返回 null元素不存在。1. 檢查選擇器:placeholder 的值是否完全一致(注意空格、全角符號)
2. 檢查渲染時機:元素是否是異步加載的?(用 setTimeout 延遲執行代碼或使用 wait 函數)
3. 檢查 iframe:元素是否嵌在 <iframe> 里?(需切換到 iframe 的文檔上下文)
返回一個元素元素存在!問題出在你的腳本環境上,進入第二步。

第二步:檢查 jQuery 環境

目的: 搞清楚 $ 到底是不是 jQuery。

操作: 在控制臺依次輸入:

typeof jQuery    // 檢查 jQuery 本身是否存在
typeof $         // 檢查 $ 是否存在
$ === jQuery     // 檢查 $ 是否就是 jQuery
場景typeof jQuerytypeof $$ === jQuery結論與解決方案
理想情況"function""function"true頁面已加載 jQuery,可直接用 $(...)
最常見情況"undefined""undefined"(報錯)頁面沒有 jQuery方案: 使用 document.querySelector 等原生 JS 方法。
沖突情況"undefined""function"(報錯)$ 被占用。可能是其他庫或瀏覽器控制臺自帶的快捷方式(僅控制臺有效)。方案: 寫腳本時不要依賴 $,堅持用原生 JS。
復雜情況"function""function"false頁面同時存在 jQuery 和另一個也使用 $ 的庫。方案: 使用 jQuery.noConflict() 釋放 $ 控制權,然后用 jQuery(...)

四、解決方案:如何正確地找到并操作元素?

方案A:堅持使用原生 JavaScript(推薦)

原生 JS 是萬能的,無需依賴任何庫,最可靠。
下面是一份「找元素」代碼清單,每條都是獨立 snippet,按場景挑一條改選擇器就能用。


① 精確屬性

document.querySelector('input[placeholder="手機號/用戶名"]')

② 任意屬性模糊

document.querySelector('input[placeholder*="用戶名"]')

③ 多個屬性組合

document.querySelector('input[type="text"][name="user"][autocomplete="off"]')

④ 按 text 內容找按鈕(無選擇器時)

Array.from(document.querySelectorAll('button')).find(b => b.textContent.trim() === '登錄')

⑤ 按部分 text 找

Array.from(document.querySelectorAll('a')).find(a => a.textContent.includes('忘記密碼'))

⑥ 父級→子級

document.querySelector('form#loginForm input[name="captcha"]')

⑦ 同級往后找

document.querySelector('label[for="pwd"]').nextElementSibling

⑧ 同級往前找

document.querySelector('button[type="submit"]').previousElementSibling

⑨ class 帶空格(精確匹配)

document.querySelector('.el-form-item.is-required')

⑩ class 模糊

document.querySelector('[class*="el-input"]')

? 第 N 個同類元素

document.querySelectorAll('.el-input__inner')[2]   // 第三個框

方案B:動態引入 jQuery(必要時)

如果非要使用 jQuery,可以采用“無侵入”的方式動態引入,避免影響原頁面。

// 1. 先判斷是否已有 jQuery
(() => {if (window.jQuery) {               // ① 已有 jQuery 直接復用console.log('jQuery 已存在,版本', window.jQuery.fn.jquery);return;}const s = document.createElement('script');s.src = 'https://code.jquery.com/jquery-3.6.0.min.js';s.onload = () => {const $$ = jQuery.noConflict(true); // ② 完全釋放 $ 和 jQueryconsole.log('jQuery 加載完成,可用 $$ 調用');// 你的業務代碼$$('[placeholder="手機號"]').val('hello');};document.head.appendChild(s);
})();

注意: 這種方式引入的 jQuery 僅在當前標簽頁生效,刷新頁面后需要重新執行。


五、總結與建議

  1. 信任控制臺document.querySelector() 是你的最佳朋友,用它來驗證元素是否存在最可靠。
  2. 警惕 $:在腳本中,除非你明確知道頁面已經加載了 jQuery,否則不要使用 $。瀏覽器控制臺里的 $ 只是“快捷方式”,不能在你的腳本代碼里使用。
  3. 優先使用原生 JS:對于自動化腳本來說,原生 JS 足夠強大且沒有外部依賴,是首選方案。
  4. 理解渲染時機:對于現代前端框架(Vue、React)構建的頁面,元素可能異步加載,因此需要“等待”元素出現后再操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98700.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98700.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98700.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SSE 模仿 GPT 響應

后端代碼 const express require(express) const cors require(cors);const app express(); app.use(cors()); const port 3000;app.listen(port, () > {console.log(Server running at http://localhost:${port}/); });const msg 全國同胞們&#xff0c; 尊敬的各位國…

MAC 多個版本 JDK進行切換

1.查看本機所有的jdk/usr/libexec/java_home -V2、打開bash_profile文件。可以在終端vim ~/.bash_profile打開&#xff0c;也可以打開訪達shiftcmdG然后輸入/Users/mac/.bash_profile&#xff08;本機bash_profile的路徑&#xff09;加入新的環境變量格式如下&#xff08;參考我…

shell 中 expect 詳解

一、概述Expect是一個免費的編程工具語言&#xff0c;用來實現自動和交互式任務進行通信&#xff0c;而無需人的干預。Expect的作者DonLibes在1990年開始編寫Expect時對Expect做有如下定義&#xff1a;Expect是一個用來實現自動交互功能的軟件套件。通過expect系統管理員可以創…

第4講 機器學習基礎概念

機器學習作為人工智能的子領域&#xff0c;專注于訓練計算機算法自動發現數據中的模式與關聯關系。以下是其核心基礎概念&#xff1a;4.1 數據數據是機器學習的基石。缺乏數據&#xff0c;算法將無從學習。數據可呈現為結構化數據&#xff08;如電子表格、數據庫&#xff09;和…

Go組合式繼承:靈活替代方案

Go 語言沒有傳統面向對象編程中的繼承機制&#xff0c;但通過組合和接口實現類似功能。Go 更提倡組合優于繼承的設計原則&#xff0c;這種設計方式更靈活且易于維護。結構體組合&#xff08;偽繼承&#xff09;通過嵌套結構體實現類似繼承的效果。子結構體可以直接訪問父結構體…

Verilog三段式FSM,實現十字路口紅綠燈

運行環境&#xff1a;VCS verdi狀態說明&#xff1a;S0 &#xff1a; 初始狀態 S1 &#xff1a; 東西方向綠燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮30周期 S2 &#xff1a; 東西方向黃燈亮&#xff0c;南北方向紅燈亮&#xff1b;點亮2 周期 S3 &#xff1a; 東西方向…

java 將pdf轉圖片

如何將pdf文件轉為圖片 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class Pdf2Png {/**…

手搓Spring

目錄 兩種方法創建Spring容器 自定義Spring容器及前置操作 Spring掃描邏輯實現 createBean()方法 getBean()方法 依賴注入&#xff08;DI&#xff09; BeanNameAware接口 InitializingBean接口 BeanPostProcessor接口 AOP的實現 Spring 是一個輕量級的 Java 開發框架…

.NET 單文件程序詳解:從原理到實踐

C# 混淆加密大師在最新版本中, 提供了.NET單文件解包打包功能, 它可以快速解包官方打包的單文件程序&#xff0c;恢復為原始的多文件結構。也可以對解包后的程序集進行混淆與加密&#xff0c;有效提升逆向門檻。最后還能重新打包成單文件程序&#xff0c;保持對用戶友好的分發形…

Spring面試題記錄?

請簡述 Spring 框架的核心是什么&#xff1f;它主要包含了哪些核心模塊&#xff1f; spring的核心模塊主要有spring-core&#xff08;工具類&#xff0c;資源加載&#xff09;&#xff0c;spring-bean&#xff08;bean的定義&#xff0c;創建&#xff0c;封裝&#xff09;&…

一次緩存引發的文件系統數據不一致問題排查與深度解析

01 起因EFC&#xff08;Elastic File Client&#xff09;是 NAS 自研的分布式文件系統客戶端&#xff0c;最近完成了對緩存架構的更新&#xff0c;現在支持多個客戶端之間構成分布式緩存&#xff0c;底層支持 NAS、CPFS 和 OSS。由于開發時間較短&#xff0c;一直沒有做 NAS 場…

Spring Boot Gateway 教程:從入門到精通

一、Spring Cloud Gateway 簡介Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 構建的 API 網關&#xff0c;旨在為微服務架構提供一種簡單而有效的路由管理方式。它取代了 Netflix Zuul&#xff0c;提供了更高效和更強大的網關解決方案。核心特點&a…

防火墻 只允許信任的幾臺服務器訪問

1. 首先&#xff0c;確保 firewalld 服務正在運行&#xff1a;systemctl start firewalld systemctl enable firewall2. 設置默認拒絕規則&#xff1a;設置默認拒絕所有流量&#xff08;拒絕所有的入站流量&#xff09;&#xff1a;firewall-cmd --zonepublic --add-rejectal…

十三,數據結構-樹

定義樹也是基于節點的數據結構&#xff0c;和鏈表不同的是&#xff0c;樹的節點可以指向多個節點。首先對樹的一些常用術語進行說明&#xff1a;最上面的節點叫做根節點&#xff0c;根位于樹頂&#xff0c;如圖中的節點A&#xff1b;和族譜一樣&#xff0c;節點有后代和祖先&am…

JVM-默背版

1.JVM對sychronized的優化&#xff1a;鎖膨脹、鎖消除、鎖粗化、自適應自旋鎖 &#xff08;1&#xff09;鎖膨脹&#xff1a;從無鎖、偏向鎖、輕量級鎖、重量級鎖的過程叫做鎖膨脹。在JDK1.6以前&#xff0c;sychronized是由重量級鎖實現的&#xff0c;加鎖和解鎖的過程需要從用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一鍵安裝)

在 Mac M 系列芯片&#xff08;Apple Silicon/ARM 架構&#xff09;上部署 YOLOv8&#xff0c;有一些注意事項&#xff1a;PyTorch 需要安裝 ARM 原生版本&#xff0c;推理可利用 Metal 后端加速 CPU。本文教你一步步完成環境配置、模型下載、依賴安裝和驗證推理。1?? 環境準…

Python爬蟲實戰:研究Units模塊,構建氣象數據采集和分析系統

1. 引言 1.1 研究背景 隨著信息技術的飛速發展,互聯網已成為全球最大的信息庫,涵蓋氣象、金融、醫療、農業等多個領域的海量數據。這些數據蘊含著巨大的潛在價值,如何有效獲取并深入分析這些數據成為當下研究的熱點。Python 作為一種功能強大的編程語言,憑借其豐富的庫資…

網頁設計模板 HTML源碼網站模板下載

互聯網已成為現代社會不可或缺的一部分&#xff0c;網站則是連接線上與線下世界的橋梁。無論是用于展示個人作品集、推廣商業產品還是提供公共服務信息&#xff0c;一個設計精良且功能完善的網站都能發揮巨大作用。然而&#xff0c;傳統的手工編碼方式不僅耗時費力&#xff0c;…

Flink KeyedProcessFunction為什么能為每個key定義State和Timer?

問題描述 一個常見的開窗邏輯&#xff08;12H 或者 500條&#xff09;&#xff1a; import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初階---函數模版、類模版

&#x1f31f;個人主頁&#xff1a;第七序章 &#x1f308;專欄系列&#xff1a;C&#xff0b;&#xff0b; 目錄 ??前言&#xff1a; &#x1f308;1.泛型編程&#xff1a; &#x1f308;2.函數模板 &#x1f36d;2.1函數模板概念 &#x1f36d;2.2函數模板格式 &am…