讓我們看一下通過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的基本知識有很大幫助。