Selenium(八):其他操作元素的方法、凍結界面、彈出對話框、開發技巧


1. 其他操作元素的方法

之前我們對web元素做的操作主要是:選擇元素,然后點擊元素或者輸入字符串。

還有沒有其他的操作了呢?有。

比如:比如鼠標右鍵點擊、雙擊、移動鼠標到某個元素、鼠標拖拽等。

這些操作,可以通過Selenium提供的ActionChains類來實現。

ActionChains類里面提供了一些特殊的動作的模擬,我們可以通過 ActionChains 類的代碼查看到,如下所示:

我們以移動鼠標到某個元素為例。

百度首頁的右上角,有個更多產品選項,如下圖所示:

 

 

如果我們把鼠標放在上邊,就會彈出下面的百度營銷、音樂、圖片等圖標。

使用ActionChains來模擬鼠標移動操作的代碼如下:

from selenium import webdriver

driver = webdriver.Chrome(r'E:\webdrivers\chromedriver.exe')
driver.implicitly_wait(5)

driver.get('https://www.baidu.com/')

from selenium.webdriver.common.action_chains import ActionChains

ac = ActionChains(driver)

# 鼠標移動到 元素上
ac.move_to_element(driver.find_element_by_css_selector('[name="tj_briicon"]')).perform()

2. 凍結界面

有些網站上面的元素,我們鼠標放在上面,會動態彈出一些內容。

比如,百度首頁的右上角,有個更多產品選項,如下圖所示:

 

 

如果我們把鼠標放在上邊,就會彈出下面的百度營銷、音樂、圖片等圖標。

如果我們要用selenium自動化點擊音樂圖標,就需要F12查看這個元素的特征。

但是當我們的鼠標從音樂圖標移開,這個欄目就整個消失了,就沒法查看其對應的HTML。

怎么辦?

可以如下圖所示:

 

在開發者工具欄console里面執行如下js代碼 :

setTimeout(function(){debugger}, 5000)

這句代碼什么意思呢?

表示在 5000毫秒后,執行debugger命令

執行該命令會瀏覽器會進入debug狀態。debug狀態有個特性,界面被凍住,不管我們怎么點擊界面都不會觸發事件。

所以,我們可以在輸入上面代碼並回車執行后,立即鼠標放在界面右上角更多產品處。

這時候,就會彈出下面的百度營銷、音樂、圖片等圖標。

然后,我們仔細等待5秒到了以后,界面就會因為執行了debugger命令而被凍住。

然后,我們就可以點擊開發者工具欄的查看箭頭,再去點擊百度營銷圖標,查看其屬性了。

3. 彈出對話框

有的時候,我們經常會在操作界面的時候,出現一些彈出的對話框。 

html代碼:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <script>
        function appendEle(info) {
            var node = document.createElement("LI");
            var textNode = document.createTextNode(info);
            node.appendChild(textNode);
            document.getElementById("add").appendChild(node);
        }
function clickResponse() { if (confirm("你確定要和小灰灰一起學Python嗎?") == true) { appendEle("確定"); } else { appendEle("取消操作"); } } function clickPrompt() { var PythonCourse = prompt("請輸入你想學習的Python課程", "Python基礎"); if (PythonCourse == null ) { appendEle("取消操作"); } else { appendEle("你想學習:" + PythonCourse); } } </script> <body> <br> <br> <button id="b1" onclick='alert("現在開始和小灰灰一起學Python!");'>alert</button> <br> <br> <button id="b2" onclick='clickResponse()'>confirm</button> <br> <br> <button id="b3" onclick='clickPrompt()'>prompt</button> <div id="add"></div> </body> </html>

分別點擊界面的3個按鈕,你可以發現:

彈出的對話框有三種類型,分別是 Alert(警告信息)、confirm(確認信息)和prompt(提示輸入)。

3.1 Alert 

Alert 彈出框,目的就是顯示通知信息,只需用戶看完信息后,點擊 OK(確定)就可以了。

那么,自動化的時候,代碼怎么模擬用戶點擊OK按鈕呢?

selenium提供如下方法進行操作

driver.switch_to.alert.accept()

注意:如果我們不去點擊它,頁面的其它元素是不能操作的。

如果程序要獲取彈出對話框中的信息內容,可以通過如下代碼 :

driver.switch_to.alert.text

示例代碼如下:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://127.0.0.1:8020/day01/index.html')

# --- alert ---
driver.find_element_by_id('b1').click()

# 打印 彈出框 提示信息
print(driver.switch_to.alert.text)

# 點擊 OK 按鈕
driver.switch_to.alert.accept()

3.2 Confirm

Confirm彈出框,主要是讓用戶確認是否要進行某個操作。

比如:當管理員在網站上選擇刪除某個賬號時,就可能會彈出Confirm彈出框,要求確認是否確定要刪除。

Confirm彈出框有兩個選擇供用戶選擇,分別是OK和Cancel,分別代表確定和取消操作。

那么,自動化的時候,代碼怎么模擬用戶點擊OK或者Cancel按鈕呢?

selenium提供如下方法進行操作:

如果我們想點擊OK按鈕, 還是用剛才的accept方法,如下:

driver.switch_to.alert.accept()

如果我們想點擊Cancel按鈕,可以用dismiss方法,如下:

driver.switch_to.alert.dismiss()

示例代碼如下:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://127.0.0.1:8020/day01/index.html')

# --- confirm ---
driver.find_element_by_id('b2').click()

# 打印 彈出框 提示信息
print(driver.switch_to.alert.text)

# 點擊 OK 按鈕
driver.switch_to.alert.accept()

driver.find_element_by_id('b2').click()

# 點擊 取消 按鈕
driver.switch_to.alert.dismiss()

3.3 Prompt

出現 Prompt 彈出框 是需要用戶輸入一些信息,提交上去。

比如:當管理員在網站上選擇給某個賬號延期時,就可能會彈出Prompt彈出框,要求輸入延期多長時間。

可以調用如下方法:

driver.switch_to.alert.send_keys()

示例代碼如下:

from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('http://127.0.0.1:8020/day01/index.html')

# --- prompt ---
driver.find_element_by_id('b3').click()

# 獲取 alert 對象
alert = driver.switch_to.alert

# 打印 彈出框 提示信息
print(alert.text)

# 輸入信息,並且點擊 OK 按鈕 提交
alert.send_keys('web自動化 - selenium')
alert.accept()

# 點擊 Cancel 按鈕 取消
driver.find_element_by_id('b3').click()
alert = driver.switch_to.alert
alert.dismiss()

注意 :有些彈窗並非瀏覽器的alert窗口,而是html元素,這種對話框,只需要通過之前介紹的選擇器選中並進行相應的操作就可以了。

4. 開發技巧

下面是一些其他的Selenium自動化技巧:

4.1 窗口大小

有時候我們需要獲取窗口的屬性和相應的信息,並對窗口進行控制。

(1) 獲取窗口大小

driver.get_window_size()

(2) 改變窗口大小 

driver.set_window_size(x, y)

4.2 獲取當前窗口標題

瀏覽網頁的時候,我們的窗口標題是不斷變化的,可以使用WebDriver的title屬性來獲取當前窗口的標題欄字符串。

driver.title

4.3 獲取當前窗口URL地址

driver.current_url

例如,訪問博客園的官方網站,並獲取當前窗口的標題。

 

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)

# 打開網站
driver.get('https://www.cnblogs.com/')

# 獲取網站標題欄文本
print(driver.title)

# 獲取網站地址欄文本
print(driver.current_url)

 

4.4 截屏

有的時候,我們需要把瀏覽器屏幕內容保存為圖片文件。

比如,做自動化測試時,一個測試用例檢查點發現錯誤,我們可以截屏為文件,以便測試結束時進行人工核查。

可以使用WebDriver的get_screenshot_as_file方法來截屏並保存為圖片。

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)

# 打開網站
driver.get('https://www.baidu.com/')

# 截屏保存為圖片文件
driver.get_screenshot_as_file('E:\\1.png')

程序運行結束后,進入E盤,就可以找到1.jpg文件了。

4.5 手機模式

我們可以通過desired_capabilities參數,指定以手機模式打開chrome瀏覽器。

參考代碼,如下:

from selenium import webdriver

mobile_emulation = { "deviceName": "Nexus 5" }

chrome_options = webdriver.ChromeOptions()

chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)

driver = webdriver.Chrome( desired_capabilities = chrome_options.to_capabilities())

driver.get('http://www.baidu.com')

input()

4.6 上傳文件

有時候,網站操作需要上傳文件。

比如,著名的在線圖片壓縮網站:https://tinypng.com/

通常,上傳圖片,是通過type屬性為file的input元素實現的。

如下所示:

<input type="file" multiple="multiple">

我們只需要定位到該元素,然后直接通過send_keys傳入要上傳的文件路徑即可。

如下所示:

ele = wd.find_element_by_css_selector('input[type=file]')
ele.send_keys(r'E:\1.png')

如果需要上傳多個文件,可以多次調用send_keys,如下:

files = ["E:\1.png", "h:\2.png"]
ele = wd.find_element_by_css_selector('input[type=file]')
for file in files:
    ele.send_keys(file)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM