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

2021-01-11 智能甄選

讓我們看一下通過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識別驗證碼
    今天,我們就簡單的說下,怎麼用python來處理驗證碼。(注意:我所有的python相關的文章用的都是python3。)準備工作1、tesseract-ocr軟體Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
  • Selenium元素定位初探(以今日頭條首頁為例)
    # -*- coding:utf-8 -*-from selenium import webdriverif __name__ == '__main__': driver = webdriver.Chrome() driver.get('https://www.toutiao.com') element_class = driver.find_element_by_id
  • javascript在自動化測試項目中的應用「軟體測試開發入門教程」
    比如說我今天分享的主題是javascript在自動化測試中的應用有些朋友說我之前講的自動化測試的東西,需要消化很久,有一定的難度,意思就是說我動不動就講測試框架,測試開發是不是會有這樣的感覺?比如今天分享的javascript,大家做軟體測試有沒有用過?
  • 從setTimeout(fn,0)函數剖析JavaScript的執行機制
    在zepto源碼中,$fn對象的ready函數有一句setTimeout(fn,0)的函數,如下圖所示:setTimeout(fn,time)作為一個延時函數,在很多時候都會使用,而time是相應的延時時間;如果time為0時,按道理說就要不延時而立即執行了,那為什麼需要特意將fn套在setTimeout裡面而不直接正常執行呢
  • 用Python識別圖形驗證碼,實現自動登陸!
    def main():    img = '1.jpeg'    img = inverse_color(img, (0, 160))    clear_noise(img)if __name__ == '__main__':    main()解決最大的問題後,接下來就是實現自動登陸
  • 在JavaScript中,使用replace()、test()和exec()方法匹配字符串
    使用字符串替換的核心JavaScript代碼如下:<script type="text/javascript">var str = "一都編程,每個知識就是一個案例。"exec()方法返回的是一個Array類型數組:運行後的結果如下:圖3在圖3中,返回的一個使用[]中括號組成的數組對象,匹配到的值是「a」,索引位置是0。表示匹配成功了。如果我們直接使用document.write()方法輸出,則輸出的值就是a。
  • 數據工程師需要掌握的 18 個 Python 庫
    它提供了Web驅動程序API,供瀏覽器與用戶操作交互並返迴響應。它運行時會直接實例化出一個瀏覽器,完全模擬用戶的操作,比如點擊連結、輸入表單,點擊按鈕提交等。所以我們使用它可以很方便的來登錄網站和爬取數據。可以使用 brew install selenium 的方式來快速安裝selenium。
  • JavaScript中的「黑話」
    「算術」算術中的位運算已被作者列為禁術,因此希望你在工程中使用位運算時,請確保你有充足的理由使用,並在需要時寫好Hack注釋。!與!!!為邏輯非操作符,可以應用於ECMAScript中的任何值,無論這個值是什麼類型,它會被強制轉化為一個布爾值變量,再對其值取反。!!
  • 在Python中使用Pandas
    Pandas是一個python庫,用於處理數據、生成統計數據、聚合數據等等。在這篇文章中,我們將討論如何使用Pandas庫進行數據選擇、聚合和統計分析。我們開始吧!我們將使用銀行客戶流失建模數據集。數據可以在這裡找到。
  • python3.8操作(插入,刪除)mysql/MariaDB資料庫
    01主題大家好,我是義縣遊學電子科技.今天來跟大家說一個工作中常用到的操作,python3.8操作MariaDB資料庫.因為MariaDB屬於mysql分支因此資料庫命令語句都是通用的非常方便.02環境python-3.8 ,64位mairadb-10.4.7,64位python包:mysql-connector-2.2.9
  • Python數據類型串講(中)
    序列中每個位置的元素都有其對應的唯一編號,也就是說我們可以通過元素的位置標識,去搜索到該元素。python中的內建序列有6種:列表、元祖、字符串、Unicode字符串、xrange對象、buffer對象,其中列表和元祖是最常見的序列,應重點掌握。字符串在上一篇文章中已簡單介紹,下面將以字符串為例,對序列的通用操作進行詳講。
  • Python,爬蟲開發的不二選擇
    (2)優勢:面向對象開源、跨平臺、市場需求旺盛;Android開發的基石, 是Web開發的主流語言;(3)缺點:佔用大量的內存,啟動時間較長,不直接支持硬體級別的處理2)Pythonpython是動態形的靈活的解釋性語言,從軟體開發到Web開發,Python都有在被使用。因為它是解釋性腳本語言,適合輕量級開發。
  • Python開發:Win10創建定時任務執行Python腳本
    2020-12-26 07:48:50 來源: 小小追 舉報   日常開發過程中,
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    基於liunx系統的python教程,課程裡也有liunx操作的詳細教學,不用擔心學習時不會操作liunx系統。 因篇幅有限,以下展示的只是課程裡部分內容如對python課程有更多疑問 請諮詢客服 1零基礎入門全能班 01 –python簡介 02 第一個程序 03-python執行方式和pycharm設置 04-程序的注釋和算術運算符 05 程序執行原理 06變量的使用以及類型 07
  • Javascript去除字符串中的點或其他符號
    今天在寫一個前端頁面的時候遇到了一個ip參數問題,我想把ip值中的點替換成 - 的形式。在前端上使用javascript進行操作的。測試了兩次沒有好用,程序直接把整個字符串都進行了替換,在考慮這個是為什麼呢?
  • python字典操作大全,學習python第7天
    python字典跟列表類型,能存儲多個數據,並且還能在訪問元素的時候可以很快定位到需要的元素。而python字典操作方法有多少種呢?下面羽憶教程為您介紹。': 11},需要注意的是python字典中的值不允許重複。
  • Python語言中使用array模塊實現動態數組的操作
    背景對於動態數組諸如創建、插入、刪除、查詢大小等操作,在C/C++語言中,可以使用標準庫中的vector類實現,而在python語言中,也同樣提供了內置的array模塊實現類似的功能。Python中的array類似於列表list,如都可以動態增刪元素,但又有所區別,list中存儲的元素類型可以不一樣,但array中元素類型必須完全一樣。另外,由於list中每個元素同時存儲了其地址即指針(用以標記每個元素的數據類型)和實際的數據,所以,在存儲及操作效率上,array又遠遠高於列表。下面通過例子講解array模塊的常用操作。
  • 武漢Python Web全棧開發工程師修煉價格_web前端開發培訓哪家好...
    3.supervisor 伺服器進程監控管理4.nginx 負載均衡5.擴展知識:如restful的基本介紹,http,https的介紹前端:1.html入門 (含基礎元素講解)2.css 入門 (含基礎樣式講解)3.javascript入門 (含基礎語法講解)4.jquery入門 (含基礎語法
  • JavaScript入門教程
    起源javascript前身叫做livescript,sun公司推出java,netspace公司引進java的概念,重新設計livescript,並更名javascript。發明者,布蘭登.艾克,表單驗證原先要經過伺服器,伺服器壓力大,等待時間長,js僅在客戶端就可完成。是什麼是一種腳本語言,是一種輕量級的程式語言。