selenium基本用法

語言: CN / TW / HK

一.元素操作

send_keys:賦值

clear:清空

click:點擊

from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css=driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者最帥")  # baidu搜索框填下搜索的內容
driver_css.clear()  # 清空搜索的內容
driver.find_element(by=By.CSS_SELECTOR, value="#su").click()  # 點擊搜索
driver.quit()  # 關閉所以窗口

二.窗口操作

maximize_window():窗口最大化

minimize_window():窗口最小化

from selenium import webdriver
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()  # 最大化
sleep(3)
driver.minimize_window()  # 最小化
sleep(3)
driver.quit()  # 關閉所以窗口

set_window_size(x,y):設置窗口大小,x為寬,y為高

set_window_position(x,y):設置窗口位置,x橫座標,y縱座標

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.set_window_size(100, 600)  # 設置窗口大小
sleep(3)
driver.set_window_position(100, 500)  # 設置窗口位置
sleep(3)
driver.quit()  # 關閉所以窗口

back():後退

forward():前進

refresh():刷新頁面

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css=driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者最帥")  # baidu搜索框填下搜索的內容
driver.find_element(by=By.CSS_SELECTOR, value="#su").click()  # 點擊搜索
driver.back()  # 後退
sleep(3)
driver.forward()  # 前進
sleep(3)
driver.refresh()  # 刷新
driver.quit()  # 關閉所以窗口

close():關閉當前主窗口(driver.get()打開的窗口)

quit():關閉當前所有窗口

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(by=By.XPATH, value="//span[contains(text(),'解碼十年 解鎖出一串發展密碼')]").click()
sleep(3)
driver.close()  # 關閉https://www.baidu.com這個窗口
driver.quit()  # 關閉所有窗口

三.窗口切換

selenium元素定位默認定位的是主窗口,若從主窗口再打開一個窗口的話需要重新切換到指定的窗口才能定位

current_window_handle:獲取當前窗口的window_name

window_handles:獲取所有窗口的window_name值,返回的是list

switch_to.window():切換窗口

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(by=By.XPATH, value="//span[contains(text(),'解碼十年 解鎖出一串發展密碼')]").click()
sleep(3)
print(driver.current_window_handle)  # 打印當前窗口的window_name
window_name_list = driver.window_handles  # 獲取當前所有窗口的window_name值
driver.switch_to.window(window_name_list[-1])  # 切換第一個打開的窗口
print(driver.current_window_handle)  # 打印切換後的window_name
driver.quit()  # 關閉所有窗口

這裏需要注意的是switch_to.window(list[下標]):

0:表示切到主窗口

-1:表示切到第一個打開的窗口

-2:表示第二個打開的窗口,依次類推

四.鼠標操作

double_click():鼠標雙擊

context_click():鼠標右擊

click():鼠標單擊

drag_and_drop(element1,element2):元素拖拽,把element1元素拖拽到element2位置

drag_and_drop_by_offset(element,x,y):元素拖拽,相對於element元素當前位置拖拽到(原x座標+x,原y座標+y)

move_to_element(element):鼠標懸停在element元素位置

move_to_element_with_offset(element,x,y):和drag_and_drop_by_offset作用相同,x,y值可為正負

click_and_hold(element):鼠標左鍵按住element元素

move_by_offset(x,y):相對於鼠標按住的位置移動(x,y)

release():釋放按住的鼠標

注:後三個一般是放在一起使用的。所有的方法都是由ActionChains(driver)實例對象調用

1.模擬鼠標操作前需要導入對應的包

from selenium.webdriver import ActionChains

2.實例化鼠標對象

action = ActionChains(driver)

3.執行鼠標操作

action.perform()

4.實例(element為需要操作的元素)

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
action = ActionChains(driver)  # 實例化鼠標對象
action.double_click(element)  # 雙擊(左鍵雙擊)
action.context_click(element)  # 鼠標右擊
action.click(element)  # 鼠標單擊
action.perform()  # 執行鼠標操作
driver.quit()  # 關閉所有窗口

五.鍵盤操作

1.模擬鍵盤操作前要先導入Keys類

from selenium.webdriver.common.keys import Keys

2.使用時用Keys.的方式去調用Keys類中的屬性

ENTER:enter回車鍵

SPACE:空格鍵

DELETE:刪除鍵

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
driver_css.send_keys(Keys.SPACE)  # 打印空格鍵
sleep(2)
driver_css.send_keys(Keys.ENTER)  # 回車搜索
sleep(2)
driver.quit()  # 關閉所有窗口

3.兩鍵組合使用

CONTROL:ctrl鍵

ctrl+a:全選

ctrl+c:複製

ctrl+v:粘貼

ctrl+x:剪切

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
driver_css.send_keys(Keys.CONTROL, "a")  # 全選
sleep(1)
driver_css.send_keys(Keys.CONTROL, "c")  # 複製
sleep(1)
driver_css.send_keys(Keys.RIGHT)  # 向右箭頭
sleep(1)
driver_css.send_keys(Keys.CONTROL, "v")  # 粘貼
sleep(1)
driver_css.send_keys(Keys.CONTROL, "a")  # 全選
sleep(1)
driver_css.send_keys(Keys.CONTROL, "x")  # 剪切
sleep(1)
driver.quit()  # 關閉所有窗口 

5.Keys類

class Keys:
    """
    Set of special keys codes.
    """

    NULL = '\ue000'
    CANCEL = '\ue001'  # ^break
    HELP = '\ue002'
    BACKSPACE = '\ue003'
    BACK_SPACE = BACKSPACE  # 刪除
    TAB = '\ue004'  # tab鍵
    CLEAR = '\ue005'
    RETURN = '\ue006'
    ENTER = '\ue007'  # 回車鍵
    SHIFT = '\ue008'  # shift鍵
    LEFT_SHIFT = SHIFT  # shift鍵
    CONTROL = '\ue009'
    LEFT_CONTROL = CONTROL  # ctrl鍵
    ALT = '\ue00a'  # alt鍵
    LEFT_ALT = ALT  # alt鍵
    PAUSE = '\ue00b'
    ESCAPE = '\ue00c'  # esc鍵
    SPACE = '\ue00d'  # 空格鍵
    PAGE_UP = '\ue00e'  # pgup
    PAGE_DOWN = '\ue00f'  # pgdn
    END = '\ue010'  # end
    HOME = '\ue011'  # home
    LEFT = '\ue012'  # 左箭頭
    ARROW_LEFT = LEFT
    UP = '\ue013'  # 上箭頭
    ARROW_UP = UP
    RIGHT = '\ue014'  # 右箭頭
    ARROW_RIGHT = RIGHT
    DOWN = '\ue015'  # 下箭頭
    ARROW_DOWN = DOWN
    INSERT = '\ue016'  # insert
    DELETE = '\ue017'  # del
    SEMICOLON = '\ue018'  # ;鍵
    EQUALS = '\ue019'  # =鍵

    NUMPAD0 = '\ue01a'  # 0-9數字
    NUMPAD1 = '\ue01b'
    NUMPAD2 = '\ue01c'
    NUMPAD3 = '\ue01d'
    NUMPAD4 = '\ue01e'
    NUMPAD5 = '\ue01f'
    NUMPAD6 = '\ue020'
    NUMPAD7 = '\ue021'
    NUMPAD8 = '\ue022'
    NUMPAD9 = '\ue023'
    MULTIPLY = '\ue024'  # *
    ADD = '\ue025'  # +
    SEPARATOR = '\ue026'  # ,
    SUBTRACT = '\ue027'  # -
    DECIMAL = '\ue028'  # .
    DIVIDE = '\ue029'  # /

    F1 = '\ue031'  # F1-F12
    F2 = '\ue032'
    F3 = '\ue033'
    F4 = '\ue034'
    F5 = '\ue035'
    F6 = '\ue036'
    F7 = '\ue037'
    F8 = '\ue038'
    F9 = '\ue039'
    F10 = '\ue03a'
    F11 = '\ue03b'
    F12 = '\ue03c'

    META = '\ue03d'
    COMMAND = '\ue03d'
    ZENKAKU_HANKAKU = '\ue040'

4.key_down和key_up

使用鼠標事件也可以模擬鍵盤操作,其中用到的就是鼠標兩個方法key_down和key_up

key_down:模擬鍵盤操作

key_up:釋放key_down按下的鍵

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
driver_css.send_keys("作者是帥哥")
action = ActionChains(driver)
action.key_down(Keys.CONTROL, element=driver_css).send_keys("a")  # 模擬鍵盤按下ctrl+a
action.key_up(Keys.CONTROL)  # 釋放按住的ctrl鍵
sleep(2)
action.key_down(Keys.DELETE)  # 模擬delete
action.key_up(Keys.DELETE)  # 釋放delete鍵
action.perform()
sleep(2)
driver.quit()  # 關閉所有窗口

六.元素等待

為什麼要設置元素等待:

電腦cpu運行的速度大於網頁加載,會導致一個問題代碼運行到這一步是,網頁還沒有渲染完,出現元素找不到問題。

1.強制等待

不管有沒有找到元素,執行到該步時都會等待設置的秒數

time.sleep(1)

sleep(number):number為等待時長,單位為秒

2.隱性等待

設置全局等待,查找每個元素時如果第一時間沒有找到,就會等待設置的時間(s),超出時間限制後還是沒有找到就會報錯

driver.implicitly_wait(50)

3.顯性等待(具體實現baidou吧)

為單個元素設置等待時長,可設置輪詢時間,既每隔多少s查詢一次,超出設置的最大時間報錯

七.下拉框

我們先來了解下html中下拉框的寫法吧,由<select><option></option>/select>組成,源碼和展示如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select id="wq">
    <option value="張三">張</option>
    <option value="李四">李</option>
    <option value="王五">王</option>
</select>
</body>
</html>

個人覺得使用xpth方法定位,利用層級關係也可以正常定位對應的option,那麼既然有專門處理下拉框的方法,也就學習一下

1.導入Select模塊

from selenium.webdriver.support.select import Select

2.實例化下拉框對象

sele = Select(driver_id)

返回的是一個list集合

3.定位option的方法

select_by_index(下標):根據下標定位對應的option

select_by_value(value值):根據option中value屬性值定位

select_by_visible_text(選項值):根據對應的option選項值定位

from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("url")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#wq")
select = Select(driver_css)  # 實例化select對象
select.select_by_index(1)  # 根據下標定位
sleep(1)
select.select_by_value("王五")  # 根據value值定位
sleep(1)
select.select_by_visible_text("張")  # 根據選項值定位
sleep(1)
driver.quit()  # 關閉所有窗口

4.既然有選擇下拉框的方法,那麼也少不了取消選擇下拉框的方法

sele.deselect_all():取消全部選擇

sele.deselect_by_index():根據下標取消選擇

sele.deselect_by_value():根據value值取消選擇

sele.deselect_by_visible_text():根據text取消選擇

注:不做演示了,該方法要在對應的選項選中後才可取消選擇,且只適用於多選的下拉框試用。帶multiple屬性值的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<select id="wq" multiple>
    <option value="張三">張</option>
    <option value="李四">李</option>
    <option value="王五">王</option>
</select>
</body>
</html>

八.三種彈框

1.js提供了三種彈框,這裏不做多餘介紹了,三種彈框的使用方法相同

alert():只含確定的選項的彈框

confirm():含確定和取消的彈框

prompt():可輸入內容的彈框

2.方法使用

alert = driver.switch_to.alert : 切換彈框

alert.send_keys("老子是無敵的") : 針對prompt彈框輸入內容

print(alert.text) : 獲取彈框文本

alert.dismiss() : 取消(alert不含取消選項,既dismiss和accept效果相同)

alert.accept() : 同意

九.滾動條

我們在一個頁面操作元素時,如果頁面有下滾動條的話,進入該窗口視窗內展示的是最上面的內容,如果定位到

最底部的話,操作元素是看不到效果的。此外,selenium是不提供滾動效果的,但提供了運行js腳本的方法,所

以可以通過寫js語法來滾動

1.方法使用

js = 'window.scrollTo(0,100)' : 下滑到指定位置,x水平,y垂直

js='window.scrollTo(0,document.body.scrollHeight)' : 滑到頁面底部

driver.execute_script(js) : 執行js腳本

十.frame表單

frame其實和切換窗口差不多,進入頁面時只會默認定位一個iframe,若想操作其它iframe的元素,需要手動切換

driver.switch_to.frame("id/name/element") : 切換到iframe表單

driver.switch_to.default_content("id/name/element") : 回到默認頁面

注:若想從非默認iframe切換到另一個非默認iframe,必須先切回默認的ifrme

十一.截圖

driver.get_screenshot_as_file("./baidu.png")

十二.使用cookie登錄

1.我們以登錄知乎為例,首先要獲取cookie值

2.添加cookie,add_cookie(cookie)

我們進入add_cookie方法源代碼可以看見需要傳遞一個字典類型的值,因此cookie傳入時要以字典的方法傳入

cookies = {
    'name': 'z_c0',
    'value': '獲取的cookie值'}

3.刷新頁面

driver.refresh()

4.完整代碼

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/signin")
cookies = {
    "name": "z_c0",
    "value": "你的知乎cookie值"
}
driver.add_cookie(cookies)  # 添加cookie
driver.refresh()  # 刷新頁面,登錄成功
driver.quit()  # 關閉所有窗口

十三.判斷元素是否可點擊,可使用,已選中

is_selected():判斷元素是否被選中,選中返回true,否則false

is_displayed():判斷端上是否可見,可見返回true,否則返回false

id_enabled():判斷按鈕是否可點擊,可點擊返回true,否則返回false

1.先來看下html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
<select id="wq">
    <option>張三</option>
    <option selected="selected">李四</option>  <!--selected設置默認選中-->
</select>
<button type="button" disabled="disabled" id="button">登錄</button>  <!--disabled設置按鈕不可點擊-->
<button type="button" style="display: none">註冊</button>  <!--display: none設置元素不可見-->
</body>
</html>

2.實例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("html 地址")
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#wq > option:nth-child(2)")
print(driver_css.is_selected())  # 判斷元素是否被選中
driver_id = driver.find_element(by=By.ID, value="button")
print(driver_id.is_enabled())  # 判斷元素是否可點擊
driver_tag_name = driver.find_elements(by=By.TAG_NAME, value="button")
print(driver_tag_name[1].is_displayed())  # 判斷元素是否可見
driver.quit()  # 關閉所有窗口

十四.其它方法使用

title:獲取當前窗口標題

current_url:獲取當前窗口url

text:獲取元素文本內容

size:獲取元素大小

get_attribute(屬性):獲取屬性值

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.title)  # 獲取頁面標題
print(driver.current_url)  # 獲取頁面url
driver_css = driver.find_element(by=By.CSS_SELECTOR, value="#su")
print(driver_css.get_attribute("id"))  # 獲取id值
print(driver_css.size)  # 獲取元素大小
print(driver_css.text)  # 獲取元素文本
driver.quit()  # 關閉所有窗口

十五.常見面試題

1.動態元素如何定位

動態元素分為兩種

(1)元素值部分可變,部分固定

xpath和css定位都提供了模糊匹配,可根據固定部分的值來匹配結果

xpath模糊匹配

driver.find_element(by=By.XPATH, value="//*[contains(@name,'na')").send_keys("作者説帥哥")  # contains匹配含有na的name屬性值
driver.find_element(by=By.XPATH, value="//*[starts-with(@name,'2')").send_keys("12")  # start-with匹配以2開頭的name屬性值
driver.find_element(by=By.XPATH, value="//*[ends-with(@name,'2')").send_keys("12")  # ends-with匹配以2結尾的name屬性值

css模糊匹配

  • 匹配以XX開頭的:value="[id^='head']")
  • 匹配以XX結尾:value="[id$='tail']"
  • 匹配包含XX的:valur="[name*='like']"

(2)元素值都不是固定值

元素值不是固定的,此時用屬性值定位是行不通的,不過可以利用層級關係定位

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<body>
<select>
    <option>張三</option>
    <option>李四</option>
</select>

</body>
</html>

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.get("http://localhost:63342/pytest_selenium/lianxi/select.html?_ijt=6s5tqd9kb7fi081s4dl8trmir3")
driver_xpath = driver.find_element(by=By.XPATH, value="/html[1]/body[1]/select[1]/option[2]")
print(driver_xpath.text)
driver.quit()  # 關閉所有窗口

2.如何操作隱藏元素

selenium並沒有提供操作隱藏元素的方法,但是提供了運行js的方法,所以我們可以通過編寫js來操作

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<button type="button" style="display: none" id="wq">登錄</button>
<button type="button" style="display: none" name="wq">註冊</button>
</body>
</html>

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://localhost:63342/pytest_selenium/lianxi/select.html?_ijt=9o3tjsdmdq67okafpu0u49td4m")
js_id = 'document.getElementById("wq").style.display = "block"'  # 去除隱藏
js_name = 'document.getElementsByName("wq")[0].style.display = "block"'  # 去除隱藏
driver.execute_script(js_id)  # 運行js
sleep(1)
driver.execute_script(js_name)  # 運行js
sleep(1)
driver.quit()  # 關閉所有窗口

十六.Chropath插件

1.下載插件:https://crx4.com/7605.html

2.下載完成後解壓到本地文件夾,打開瀏覽器擴展程序,打開開發者模式

3.點擊加載已解壓的擴展程序,導入即可

4.這時我們就可以看見導入的插件了,左側選擇對應的元素,右側chropath  tab下會展示具體的value值

5.chropath不支持切換frame,只能定位默認的frame