在Python Selenium WebDriver中使用JavaScript執行操作

2021-01-09 智能甄選

讓我們看一下通過Python Selenium WebDriver執行JavaScript語句的幾種不同方法。

在本教程中,讓我們分析Selenium WebDriver中使用最少但功能最強大的功能。是的,我將討論JavaScript執行器,並向您展示通過Python Selenium WebDriver執行JavaScript語句的幾種不同方法。

可能會發生這種情況,在某些實時項目中,Selenium WebDriver無法對特定的Web元素執行操作。例如,由於WebDriver模擬最終用戶交互,因此很自然地會拒絕單擊最終用戶看不到的元素(有時即使Web元素在頁面上可見,也會發生這種情況)。可能有其他幾個類似的原因或情況。

在這些情況下,我們可以依靠JavaScript來單擊或對該Web元素執行操作,並且可以通過WebDriver執行這些JavaScript語句。

您可以使用JavaScript執行WebElement界面所做的所有操作。

什麼是JavaScript?

JavaScript是一種腳本語言,它在客戶端運行,即在瀏覽器上運行,並且當您瀏覽網頁時會做一些神奇的事情。有關更多詳細信息,請在DZone上搜索關鍵字「JavaScript」。

我們如何在WebDriver中使用JavaScript?

Python Selenium WebDriver提供了一個內置方法:

driver.execute_script("some javascript code here");

我們可以通過兩種方式在瀏覽器中執行JavaScript。

方法1:在文檔根級別執行JavaScript

在這種情況下,我們使用JavaScript提供的方法捕獲我們想要使用的元素,然後在其上聲明一些操作並使用WebDriver執行此JavaScript。

例:

javaScript = "document.getElementsByName('username')[0].click();"driver.execute_script(javaScript)

我們在這裡做什麼?

第1步:我們正在使用JavaScript檢查並通過屬性「名稱」獲取元素。(另外,可以使用'id'和'class'屬性。)

第2步:使用JavaScript聲明並對元素執行單擊操作。

第3步:調用execute_script()方法並將我們創建的JavaScript作為字符串值傳遞。

請注意 上面[0] 的 getElementsByName('username')[0] 聲明。JavaScript函數 getElementsByName , getElementsByClassName 等返回所有匹配的元件的陣列。在我們的例子中,我們需要對可以通過的第一個匹配元素進行操作 index [0] 。如果您知道自己在做什麼,即,如果您知道要操作的元素的索引,則可以直接使用索引,例如 getElementsByName('username')[2] 。

但是,如果您使用的是JavaScript函數' getElementById ',則不需要使用任何索引,因為它只返回一個元素('id'應該是唯一的)。

執行時,WebDriver會將JavaScript語句注入瀏覽器,腳本將執行該任務。在我們的示例中,它對目標元素執行單擊操作。此JavaScript具有自己的命名空間,不會干擾實際網頁中的JavaScript。

方法2:在元素級別執行JavaScript

在這種情況下,我們使用WebDriver捕獲我們想要使用的元素,然後使用JavaScript在其上聲明一些操作,並通過將web元素作為參數傳遞給JavaScript來使用WebDriver執行此JavaScript。

這令人困惑嗎?讓我們分解吧。

例如:

userName = driver.find_element_by_xpath("//button[@name='username']")driver.execute_script("arguments[0].click();", userName)

我們在這裡做什麼?

第1步:使用WebDriver提供的方法檢查和捕獲元素,例如'find_element_by_xpath ':

userName = driver.find_element_by_xpath("//button[@name='username']")

第2步:使用JavaScript聲明並對元素執行單擊操作:

arguments[0].click()

第3步:execute_script() 使用我們創建的JavaScript語句作為字符串值調用 方法,並使用WebDriver作為參數捕獲Web元素:

driver.execute_script("arguments[0].click();", userName)

上面兩行代碼可以縮短為下面的格式,我們使用WebDriver找到一個元素,聲明一些JavaScript函數,並使用WebDriver執行JavaScript。

driver.execute_script("arguments[0].click();",driver.find_element_by_xpath("//button[@name='username']"))

更頻繁面臨的另一個問題是需要滾動到網頁的底部。您可以在一行代碼中執行此操作:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

此外,您的語句中可以有多個JavaScript操作。

例如:

userName = driver.find_element_by_xpath("//button[@name='username']")password = driver.find_element_by_xpath("//button[@name='password']")driver.execute_script("arguments[0].click();arguments[1].click();", userName, password)

在這種情況下,web元素的順序的使用很重要。訪問 index 與 [0] 一個JavaScript語句中的任何位置將檢索傳遞的第一個網頁元素。

driver.execute_script("arguments[1].click();arguments[0].click();", userName, password)

如何返回值

JavaScript執行程序的另一個重要方面是它可用於從Web元素中獲取值。這意味著該 execute_script() 方法可以返回值。

例如:

print driver.execute_script('return document.getElementById("fsr").innerText')

請注意,如果您想要JavaScript代碼返回的內容,則需要使用return。此外,可以使用Selenium定位元素並將其傳遞到腳本中。

什么元素找不到會發生什麼?

當JavaScript找不到要操作的元素時,它會拋出帶有相應錯誤消息的WebDriver異常。

場景1:我們正在嘗試使用' print driver.execute_script('return document.getElementById("fsr").innerText') ' 來讀取屬性, 但網頁中沒有這樣的元素。我們在異常跟蹤中收到以下消息:

selenium.common.exceptions.WebDriverException: Message: unknown error: Cannot read property 'innerText' of null

場景2:我們試圖在JavaScript中使用無效的操作或錯誤函數名稱,例如' print driver.execute_script('document.getElementById("fsr").clic();') '。(注意click() 方法名稱中的拼寫錯誤 。)

selenium.common.exceptions.WebDriverException: Message: unknown error: document.getElementById(...).clic is not a function

摘要

以下是可以使用JavaScript的一些潛在操作的摘要。

獲取元素文本或屬性找到一個元素對元素做一些操作,比如 click()更改元素的屬性滾動到網頁上的元素或位置等到頁面加載完畢使用Selenium處理DOM時,JavaScript的基本知識有很大幫助。

相關焦點

  • Python+Selenium詳解(超全)
    這也是最重要的一點,不管你以前更熟悉 C、 java、ruby、python、或都是 C# ,你都可以通過 selenium 完成自動化測試,而 QTP 只支持 VBS支持多平臺:windows、linux、MAC ,支持多瀏覽器:ie、ff、safari、opera、chrome支持分布式測試用例的執行,可以把測試用例分布到不同的測試機器的執行,相當於分發機的功能。
  • Python無頭爬蟲Selenium系列(01):像手工一樣操作瀏覽器
    本系列將全面講解 Python 中一個非常成熟的庫 —— selenium,並教會你如何使用它爬取網絡上所需的數據自動化爬蟲雖然方便,但希望大家能顧及網站伺服器的承受能力,不要高頻率訪問網站。並且千萬不要採集敏感數據!!
  • 您需要知道的有關Selenium雲端測試都在這裡
    針對此類測試,我們來討論如下的測試步驟:在Firefox瀏覽器中打開DuckDuckGo。找到搜索框。輸入查詢的內容,即LambdaTest。執行搜索操作。我們在Selenium中、以及代碼中都使用到了XPath元素的屬性。
  • Python爬蟲模擬登陸嗶哩嗶哩(bilibili)並突破點選驗證碼功能
    2.安裝selenium庫由於是第三方庫,所以在使用selenium之前需要先安裝:pip install selenium安裝的時候建議大家換鏡像源,具體方法可以參考這篇文章,根據上面給出的編程思路大家一步一步做就好了,我就不再詳細解釋了,如果任何問題歡迎評論區提問或者私信我都可以喔~#login_bilibilifrom selenium import webdriverimport time
  • 微軟最強 Python 自動化工具開源了!不用寫一行代碼!
    API,可以結合 Pytest 測試框架使用,並且支持瀏覽器端的自動化腳本錄製 項目地址: https://github.com/microsoft/playwright-python 2.
  • 如何在javascript中創建一個對象?
    javascript是一門基於對象而不是面向對象的語言,由於它的這個缺陷,在javascript中實現面向對象時十分彆扭,就比如創建對象,由於在ES6之前沒有class關鍵字,想要創建對象必須依賴以下幾種間接方式。
  • 只需一臺電腦,用 Python 實時追蹤新冠病毒分布
    作者發布了文章介紹該操作過程,雷鋒網 AI 源創評論將其編譯如下。ChromeDriver 將幫助我們能夠控制瀏覽器並向其發送命令,從而進⾏測試和之後的其它操作,可以通過連結( https://chromedriver.chromium.org/ )下載與你電腦系統相匹配的安裝包。Ps:如果你不是很熟悉 ChromeDriver,建議儘可能使用最新穩定版本。
  • 這一次,徹底弄懂 JavaScript 執行機制
    我們真的要徹底弄明白javascript的執行機制了。1.關於javascriptjavascript是一門單線程語言,在最新的HTML5中提出了Web-Worker,但javascript是單線程這一核心仍未改變。
  • 「首席架構師推薦」一系列很棒的的瀏覽器端JavaScript庫資源(1)
    HeadJS - HEAD中唯一的腳本。curl - 一個小型,快速,可擴展的模塊加載器,可處理AMD,CommonJS模塊/ 1.1,CSS,HTML /文本和舊腳本。Enzyme - Enzyme是React的JavaScript測試實用程序,可以更容易地斷言,操作和遍歷React Components的輸出。反應測試庫 - 簡單而完整的React DOM測試實用程序,可以鼓勵良好的測試實踐。
  • 3.1.5 JavaScript中switch語句的使用
    在JavaScript中使用if-else-if語句可以實現多路選擇功能,但其結構使程序看起來很不清晰,也不容易維護。而switch語句是典型的多路分支(多路選擇)語句,其作用與if-else-if語句基本相同,但switch語句比if-else-if語句更具有可讀性,它可以根據一個表達式的值在給定的多個選擇中選擇一個符合條件的分支來執行。而且switch語句允許在找不到一個匹配條件的情況下能執行默認的一個分支。
  • 如何使用Visual Studio工具創建python項目
    python一般情況下,我們使用Visual Studio進行C#、C++和C語言項目進行開發。隨著工具不斷完善,現在也可以進行python項目開發了。那麼,如何在Visual Studio 2019工具上創建python項目?操作步驟:1、通過快捷方式或電腦開始菜單,雙擊打開Visual Studio 2019工具
  • Python爬蟲為你揭示:全網熱乾麵誰家銷量最高
    數據獲取使用selenium抓取淘寶商品首先確定爬蟲的策略,淘寶的商品頁面數據是通過Ajax加載的,但是這些Ajax接口和參數比較複雜,可能會包含加密秘鑰等,所以想要自己分析Ajax並構造參數,還是比較困難的。對於這種頁面,最方便快捷的方法就是通過Selenium。
  • 3.2.3 JavaScript中for循環語句的使用
    如果循環變量的值超出了該邊限,則停止該循環語句的執行。3)迭代語句:用來改變循環變量的值,從而控制循環的次數,通常是對循環變量的值進行變大或變小的操作。4)語句組:用來指定循環體,可以是一條或多條語句。
  • 在Python中使用Pandas
    Pandas是一個python庫,用於處理數據、生成統計數據、聚合數據等等。在這篇文章中,我們將討論如何使用Pandas庫進行數據選擇、聚合和統計分析。我們開始吧!我們將使用銀行客戶流失建模數據集。數據可以在這裡找到。
  • Python爬取某境外網站漫畫,心血來潮,爬之
    本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。轉載地址https://blog.csdn.net/fei347795790?t=1某年某月某日,重溫某本漫畫,心血來潮,爬之!!!
  • javascript中那些奇怪的特性
    請牢記,我並不建議使用全部的特性,這會讓你的同事變得暴躁儘管這些特性看起來很酷。注意:我這裡談到的並不包括,提升,閉包,代理,原形繼承,異步,生成器等。雖然以上這些特性不易理解,但是卻非常實用。Void操作符JavaScript 有一個一元的void操作符。你可能已經看到它被用作void(0)或void 0。
  • Python之UnitTest中yaml文件使用
    PyYaml的介紹在上一節中,我們說到了DDT數據驅動的使用,我們可以讀取txt文本文件來實現數據和代碼的分離,其實我們還可以使用今天要介紹的這種方式,那就是直接讀取yaml文件PyYaml的安裝pip install pyyaml
  • Python,爬蟲開發的不二選擇
    ,Python都有在被使用。1、發起請求使用http庫向目標站點發起請求,即發送一個RequestRequest包含:請求頭、請求體等Request模塊缺陷:不能執行可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。。用這個框架可以輕鬆爬下來如亞馬遜商品信息之類的數據。
  • Python3.9官方文檔翻譯版之解釋器的使用1
    自譯:在Windows機器上你可以通過微軟軟體商店進行python安裝,這樣python3.9的命令可以直接被使用。如果你通過.exe執行文件安裝的話,你可以使用python命令進行使用。為了可以登錄使用python對於環境變量的設置可以參見附件。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。 因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07