天天看點

python selenium 基本常用操作

 最近學習UI自動化,把一些常用的方法總結一下,友善自己以後查閱需要。因本人水準有限,有不對之處多多包涵!歡迎指正!

一、xpath模糊比對定位元素

武林至尊,寶刀屠龍刀(xpath),倚天不出(css),誰與争鋒

 學會了xpath,媽媽再也不用擔心我定位不到元素啦 ^_^

# coding:utf-8
import time

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# driver.set_window_size(600, 800)
time.sleep(2)
# xpath模糊比對功能
driver.find_element_by_xpath("//*[contains(text(), '地圖')]").click()
# xpath模糊比對某個屬性,尋找頁面id屬性包含‘kw’的所有元素
driver.find_element_by_xpath("//*[contains(@id, 'kw')]").send_keys("selenium")
# xpath模糊比對以什麼開頭
driver.find_element_by_xpath("//*[starts-with(@id, 'k')]").send_keys("selenium")
# xpath模糊比對以什麼結尾
driver.find_element_by_xpath("//*[ends-with(@name, 'hao123')]").click()    # 目測不行,提示沒有這個文法了
# xpath使用正規表達式定位
driver.find_element_by_xpath("//*[matchs(text(),'hao13']").click()
# driver.close()
# driver.quit()      

二、鍵盤操作

1、selenium 提供了一整套的模拟鍵盤操作事件

2、模拟鍵盤的操作需要先導入鍵盤子產品:from selenium.webdriver.common.keys import Keys

3、模拟 enter 鍵,可以用 send_keys(Keys.ENTER)

4、其它常見的鍵盤操作:

鍵盤 F1 刡 F12:send_keys(Keys.F1) 把 F1 改成對應的快捷鍵

複制 Ctrl+C:send_keys(Keys.CONTROL,'c')

粘貼 Ctrl+V:send_keys(Keys.CONTROL,'v')

全選 Ctrl+A:send_keys(Keys.CONTROL,'a')

剪切 Ctrl+X:send_keys(Keys.CONTROL,'x')

制表鍵 Tab: send_keys(Keys.TAB)

# coding:utf-8
import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys


driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(1)
driver.find_element_by_id("kw").send_keys("selenium")
# 模拟鍵盤進行回車操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)      

三、滑鼠操作

1、滑鼠不僅僅可以點選(click),還有其它的操作,如:滑鼠懸停在某個元素上,滑鼠點選,滑鼠按住某個按鈕拖動

2、滑鼠事件需要先導入子產品:from selenium.webdriver.common.action_chains import ActionChains

3、perform() 執行所有 ActionChains 中的行為 move_to_element() 滑鼠懸停

4、除了常用的滑鼠懸停事件外,還有 點選擊滑鼠:context_click();輕按兩下滑鼠:double_click() 

# coding:utf-8
import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
time.sleep(1)
# 滑鼠懸停在設定按鈕上
ele = driver.find_element_by_link_text("設定")
ActionChains(driver).move_to_element(ele).perform()      

四、多視窗句柄處理

1、擷取目前視窗句柄:driver.current_window_handle

2、擷取所有視窗句柄:driver.window_handles

3、判斷目前視窗是不是 list 中第二個值

# coding:utf-8
import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


driver = webdriver.Chrome()
driver.get("https://news.baidu.com/")
time.sleep(1)
# 擷取目前視窗句柄
h = driver.current_window_handle
print(h)
# 點選第一條新聞
driver.find_element_by_xpath("//*[@id='pane-news']/div[1]/ul[1]/li[1]/strong/a").click()
time.sleep(1)
# 擷取所有視窗句柄
hs = driver.window_handles
print(hs)
print("切換前的title", driver.title)    # 列印目前視窗title
time.sleep(1)
# 判斷目前視窗句柄是等于清單中第二個值
if h != hs[1]:
    driver.switch_to.window(hs[1])    # 切換到其二個視窗
    time.sleep(1)
    print("切換後的title:", driver.title)
      
driver.switch_to.window(h)    # 切回之前的視窗
print("主視窗的title:", driver.title)
driver.quit()      

五、iframe切換

切換iframe有三種方法:id直接切換、name直接切換、使用元素定位方法定位到iframe再執行切換操作

# coding:utf-8
import time

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("https://mail.163.com/")
driver.implicitly_wait(10)
# 直接使用id、name屬性
# driver.switch_to.frame("id屬性")
# 使用元素定位方法,切換
ele = driver.find_element_by_xpath("//*[@id='loginDiv']/iframe")
driver.switch_to.frame(ele)
# 輸入賬号密碼
driver.find_element_by_name("email").send_keys("xxx")
driver.find_element_by_name("password").send_keys("ddd")      

六、select下拉框定位

select_by_index() :通過索引定位

select_by_value() :通過 value 值定位

select_by_visible_text() :通過文本值定位

deselect_all() :取消所有選項

deselect_by_index() :取消對應 index 選項

deselect_by_value() :取消對應 value 選項

deselect_by_visible_text() :取消對應文本選項

first_selected_option() :傳回第一個選項

all_selected_options() :傳回所有的選項

# coding:utf-8
import time

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains


driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.implicitly_wait(10)
ele = driver.find_elements_by_xpath("//*[text()='設定']")
ActionChains(driver).move_to_element(ele[1]).perform()
driver.find_element_by_xpath("//*[text()='搜尋設定']").click()
time.sleep(2)
# 二次定位,先定位select下拉框,再定位裡面的選項
# driver.find_element_by_id("nr").find_element_by_xpath("//*[@value='50']").click()
# 通過xpath或者css,直接定位
# driver.find_element_by_xpath("//*[@id='nr']/option[2]").click()
# 使用select子產品定位
from selenium.webdriver.support.select import Select

ele = driver.find_element_by_id("nr")
# 通過索引
# Select(ele).select_by_index(2)
# 通過value值
# Select(ele).select_by_value("50")
# 通過text文本
Select(ele).select_by_visible_text("每頁顯示50條")
driver.quit()      

七、alert彈框操作

alert\confirm\prompt 彈出框操作主要方法有:

1、text:擷取文本值 accept() :點選"确認"

2、dismiss() :點選"取消"或者叉掉對話框

3、send_keys() :輸入文本值 --僅限于 prompt,在 alert 和 confirm 上沒有輸入 框

# coding:utf-8
import time

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("xxxx")
# 切換到alert彈框
t = driver.switch_to.alert
print("列印彈框文本内容:%s" % t.text)
# 點選确認按鈕
t.accept()
# 點選取消按鈕
t.dismiss()      

 八、radio和checkbox

 複制下面這段HTML,儲存到本地

<html>
<head>
<meta http-equiv="content-type"
content="text/html;charset=utf-8" />
<title>單選框和複選框</title>
</head>
<body>
</form>
<h4>單選:性别</h4>
<form>
<label value="radio">男</label>
<input name="sex" value="male" id="boy" type="radio"><br>
<label value="radio1">女</label>
<input name="sex" value="female" id="girl" type="radio">
</form>
<h4>學習自動化測試,測試定位單選框和複選框</h4>
<form>
<!-- <label for="c1">checkbox1</label> -->
<input id="c1" type="checkbox">selenium<br>
<!-- <label for="c2">checkbox2</label> -->
<input id="c2" type="checkbox">python<br>
<!-- <label for="c3">checkbox3</label> -->
<input id="c3" type="checkbox">appium<br>
<!-- <form>
<input type="radio" name="sex" value="male" /> Male
<br />
<input type="radio" name="sex" value="female" /> Female
</form> -->
</body>
</html>      

1、判斷單選框或複選框是否被選中:is_selected()

我們通過is_selected()這個方法判斷是否被選中,如果已經選中則不進行點選操作

# coding:utf-8
import time

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("本地HTML儲存的路徑")
# 點選單選框男
driver.find_element_by_id("boy").click()
time.sleep(1)
# 點選單選框女
driver.find_element_by_id("girl").click()
time.sleep(1)
# 點選複選框selenium
driver.find_element_by_id("c1").click()
time.sleep(1)
# 複選框全部勾選
ele = driver.find_elements_by_xpath("//*[@type='checkbox']")
for i in ele:    # 疊代清單中的所有元素
    if not i.is_selected():    # 判斷複選框是否被選中
        i.click()
time.sleep(2)
driver.quit()      

九、添加浏覽器配置

 使用腳本打開的浏覽器預設是沒有加載浏覽器配置的

 1、找到浏覽器配置檔案的位址:Firefox浏覽器找到幫助 > 故障排除資訊 > 配置檔案夾

python selenium 基本常用操作
python selenium 基本常用操作

Chorme浏覽器檢視配置檔案:

在浏覽器中輸入:chrome://version/

參考代碼:

# coding:utf-8
import time

from selenium import webdriver


# Firefox加載配置檔案
# 配置檔案位址
# profile_directory = r"C:\Users\xxx\AppData\Roaming\Mozilla\Firefox\Profiles\ffiou55e.default"
# 加載配置
# profile = webdriver.FirefoxProfile(profile_directory)
# 啟動浏覽器配置
# driver = webdriver.Firefox(profile)

# Chrome加載配置檔案
option = webdriver.ChromeOptions()
option.add_argument(r"-user--data-dir=C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default")
driver = webdriver.Chrome(chrome_options=option)
driver.get("https://www.baidu.com")
time.sleep(2)
driver.quit()      

其他的一些關于Chrome的實用參數及簡要的中文說明(使用方法同上,當然也可以在shell中使用)

–user-data-dir=”[PATH]” 指定使用者檔案夾User Data路徑,可以把書簽這樣的使用者資料儲存在系統分區以外的分區。

–disk-cache-dir=”[PATH]“ 指定緩存Cache路徑

–disk-cache-size= 指定Cache大小,機關Byte

–first run 重置到初始狀态,第一次運作

–incognito 隐身模式啟動

–disable-javascript 禁用Javascript

--omnibox-popup-count="num" 将位址欄彈出的提示菜單數量改為num個。我都改為15個了。

--user-agent="xxxxxxxx" 修改HTTP請求頭部的Agent字元串,可以通過about:version頁面檢視修改效果 

--disable-plugins 禁止加載所有插件,可以增加速度。可以通過about:plugins頁面檢視效果 

--disable-javascript 禁用JavaScript,如果覺得速度慢在加上這個

--disable-java 禁用java 

--start-maximized 啟動就最大化

--no-sandbox 取消沙盒模式

--single-process 單程序運作

--process-per-tab 每個标簽使用單獨程序

--process-per-site 每個站點使用單獨程序

--in-process-plugins 插件不啟用單獨程序

--disable-popup-blocking 禁用彈出攔截

--disable-plugins 禁用插件

--disable-images 禁用圖像

--incognito 啟動進入隐身模式

--enable-udd-profiles 啟用賬戶切換菜單

--proxy-pac-url 使用pac代理 [via 1/2]

--lang=zh-CN 設定語言為簡體中文

--disk-cache-dir 自定義緩存目錄

--disk-cache-size 自定義緩存最大值(機關byte)

--media-cache-size 自定義多媒體緩存最大值(機關byte)

--bookmark-menu 在工具 欄增加一個書簽按鈕

--enable-sync 啟用書簽同步

 十、js

1、js處理滾動條,

window.scrollTo(num1, num2)

num1:控制橫向滾動條的位置,當設定為10000時,滾動條處于最右端

num2:控制縱向滾動條的位置,當設定為10000時,滾動條處于最底端

有時候有些元素在頁面的具體位置我們并不清楚,很難通過滾動條來準确的将元素顯示在頁面中,此時可以使用聚焦元素

聚焦元素

ele = driver.find_element_by_xpath("//*[text()='百度推廣']")

driver.execute_script("arguments[0].scrollIntoView();", ele)

# coding:utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.set_window_size(500, 500)
driver.get("https://www.baidu.com/")
time.sleep(2)
# 滾動到底部
js = "window.scrollTo(0, document.body.scrollHeight)"
driver.execute_script(js)
time.sleep(2)
# 滾動到頂部    (window.scrollTo(橫向滾動條, 縱向滾動條))
js = "window.scrollTo(10000, 10000)"
driver.execute_script(js)
time.sleep(2)
# 聚焦元素
ele = driver.find_element_by_xpath("//*[text()='百度推廣']")
driver.execute_script("arguments[0].scrollIntoView();", ele)

driver.quit()      

2、JS處理iframe中的元素

 當我們處理iframe中的元素的時候經常會忘記切入或切出iframe,使用js一步定位到iframe中的元素可以避免切入或切出iframe

 關于跨域參考:https://www.cnblogs.com/scode2/p/8818098.html

# coding:utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://email.163.com/")
time.sleep(2)
# js處理iframe問題。因為163網站的這個iframe跨域了,是以這裡不能用了
username = "xxx"
js = "document.querySelectorAll('div#panel-163>iframe')[0]" \
     ".contentWindow.document.getElementByName('email')" % username
driver.execute_script(js)
driver.quit()      

3、JS去除元素屬性

 我們在工作中有時候會遇到有些輸入框不能輸入

基本思路:使用 js 去掉元素的 readonly 屬性,然後就可以直接輸入了

# coding:utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.12306.cn/index/")
time.sleep(2)
# 使用js去除readonly屬性
js = "document.getElementById('train_date').removeAttribute('readonly')"
driver.execute_script(js)

# 清空文本框,輸入日期
driver.find_element_by_id("train_date").clear()
driver.find_element_by_id("train_date").send_keys("2018-01-01")
time.sleep(2)
# 使用js輸入日期,隻需要修改value值就行了
js_value = "document.getElementById('train_date').value='2018-12-12'"
driver.execute_script(js_value)
time.sleep(4)
driver.quit()      

4、JS處理内嵌頁滾動條

 處理内嵌頁滾動條前,我們需要先認識下什麼是内嵌頁滾動條

将一下代碼複制下來,儲存為html格式的檔案,在浏覽器中打開就能看到内嵌頁

<!DOCTYPE html>
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html>
    <head>
        <style type="text/css">
            div.scroll{
                background-color:#afafaf;
                width:500px;
                height:100px;
                overflow:auto;
            }
        </style>
    </head>
    <body>
        <p>這是一個内嵌的 div 滾動條</p>
        <div id="xxx" name="name" class="scroll">
            臣亮言:先帝(1)創業(2)未半而中道(3)崩殂(4),今(5)天下三分(6),益州疲弊(7),此(8)誠危急存亡之秋也。然(9)侍衛之臣不懈于内,忠志之士忘身(10)于外者,蓋追先帝之殊遇(11),欲報之于陛下也。誠宜開張聖聽,以光(13)先帝遺德,恢弘(15)志士之氣,不宜妄自菲薄(16),引喻失義(17),以塞忠谏之路也(18)。
宮中府中,俱為一體(19);陟罰臧否(20),不宜異同:若有作奸犯科(21)及為忠善者(22),宜付有司(23)論其刑賞(24),以昭陛下平明之理(25);不宜偏私(26),使内外異法也(27)。
侍中、侍郎郭攸之、費祎、董允等,此皆良實,志慮忠純(28),是以先帝簡拔以遺陛下(29):愚以為宮中之事,事無大小,悉以咨之(30),然後施行,必能裨補阙漏(31),有所廣益(32)。
将軍向寵,性行淑均(33),曉暢(34)軍事,試用(35)于昔日,先帝稱之曰“能”,是以衆議舉寵為督(36):愚以為營(37)中之事,悉以咨之,必能使行陣(38)和睦,優劣得所(39)。
親賢臣,遠小人(40),此先漢是以興隆也;親小人,遠賢臣,此後漢是以傾頹(41)也。先帝在時,每與臣論此事,未嘗不歎息痛恨(42)于桓、靈也。侍中、尚書、長史、參軍,此悉貞良死節(43)之臣,願陛下親之信之,則漢室之隆(44),可計日(45)而待也。
臣本布衣(46),躬耕于(47)南陽(48),苟全(49)性命于亂世,不求聞達于諸侯(50)。先帝不以臣卑鄙(51),猥(52)自枉屈,三顧(53)臣于草廬之中,咨臣以當世之事,由是感激(54),遂許先帝以驅馳(55)。後值傾覆,受任于敗軍之際,奉命于危難之間:爾來二十有(56)一年矣。
先帝知臣謹慎,故臨崩寄臣以大事也(57)。受命以來,夙夜憂歎(58),恐托付不效,以傷先帝之明;故五月渡泸(59),深入不毛(60)。今南方已定,兵甲已足(61),當獎率(62)三軍,北定中原,庶竭驽鈍(63),攘除奸兇(64),興複漢室,還于舊都(65)。此臣是以報先帝而忠陛下之職分也(66)。至于斟酌損益(67),進盡忠言,則攸之、祎、允之任也。
願陛下托臣以讨賊興複之效(68),不效,則治臣之罪(69),以告(70)先帝之靈。若無興德之言(71),則責攸之、祎、允等之慢(72),以彰其咎(73);陛下亦宜自謀,以咨诹善道(74),察納雅言(75),深追先帝遺诏(76)。臣不勝受恩感激。
今當(77)遠離,臨表涕零(78),不知所言(79)。
嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻xxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwqqqqqqqqqqqqqqqqqqqqqqqqqqqsssssssssssssssssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
        </div>
        <p>這是一個内嵌的 div 滾動條</p>
    </body>
</html>      

基本思路:定位到内嵌頁上,然後執行滾動操作

# coding:utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get(r"C:\Users\v_gxfguo\Desktop\js.html")
time.sleep(2)
# 通過id屬性來控制scrollTo的值進行控制滾動條
# 縱向滾動到底部
js = "document.getElementById('xxx').scrollTop=10000"
driver.execute_script(js)
time.sleep(2)
# 縱向滾動到頂部
js = "document.getElementById('xxx').scrollTop=0"
driver.execute_script(js)
time.sleep(2)

# 橫向滾動到最右側
js = "document.getElementsByClassName('scroll')[0].scrollLeft=10000"
driver.execute_script(js)
time.sleep(2)
# 橫向滾動到最左側
js = "document.getElementsByClassName('scroll')[0].scrollLeft=0"
driver.execute_script(js)
time.sleep(2)

driver.quit()      

五、JS處理多個浏覽器視窗

1、元素屬性有:terget='_blank' 屬性,會打開新标簽頁

2、隻需要去掉 _blank屬性,再點選就不會打開新标簽頁了

注意:并不是所有的連結都适用于本方法,這裡隻适用于有這個 target="_blank"屬性連結情況

python selenium 基本常用操作

将 target 的屬性值修改為空,再點選就不會再打開新标簽頁

# coding:utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://news.baidu.com/")
time.sleep(2)

# 使用 JS 去掉第一條新聞的 target 屬性
js = "document.getElementsByClassName('a3')[0].target=''"
driver.execute_script(js)
# 再點選第一條新聞
driver.find_elements_by_class_name("a3")[0].click()
time.sleep(2)
driver.quit()      

 六、JS處理點選失效

有時候我們點選一個元素後,沒有任何響應,也沒有報錯,那可能就是點選失效了

對于點選失效提供兩種解決方案:

1、先點選父元素,再點選該元素

2、使用 js 直接點選

在百度設定時,點選儲存設定有時候會出現點選失效的情況

# coding:utf-8
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.select import Select

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com/")
time.sleep(2)

# 先進入到設定
ele = driver.find_element_by_link_text("設定")
ActionChains(driver).move_to_element(ele).perform()
time.sleep(1)
driver.find_element_by_link_text("搜尋設定").click()
time.sleep(1)
# 修改每頁顯示條數為50
Select(driver.find_element_by_id("nr")).select_by_index(2)

# 方法一:先點選父元素,再點選儲存按鈕
# driver.find_element_by_id("gxszButton").click()
# driver.find_element_by_class_name("prefpanelgo").click()

# 方法二:使用JS直接點選
js = "document.getElementsByClassName('prefpanelgo')[0].click()"
driver.execute_script(js)
time.sleep(1)
driver.quit()      

selenium 常見異常

1.NoSuchElementException:沒有找到元素

2.NoSuchFrameException:沒有找到 iframe

3.NoSuchWindowException:沒找到視窗句柄 handle

4.NoSuchAttributeException:屬性錯誤

5.NoAlertPresentException:沒找到 alert 彈出框

6.ElmentNotVisibleException:元素不可見

7.ElementNotSelectableException:元素沒有被選中

8.TimeoutException:查找元素逾時

總結下ui元素定位界的降龍十八掌

# 單數定位,擷取的結果都是單數
driver.find_element_by_id(self, id)    # 通過ID定位
driver.find_element_by_name(self, name)    # 通過NAME定位
driver.find_element_by_class_name(self, class name)    # 通過CLASS定位
driver.find_element_by_link_text(self, link text)    # 通過連結文本定位
driver.find_element_by_partial_link_text(self, partial link text)    # 通過連結部分文本定位
driver.find_element_by_tag_name(self, tagname)    # 通過元素标簽定位
driver.find_element_by_xpath(self, xpath)    # 通過XPATH文法定位
driver.find_element_by_css_selector(self, css)    # 通過CSS文法定位

# 複數定位,擷取的結果都是list資料類型
driver.find_elements_by_id(self, id)    # 通過ID定位
driver.find_elements_by_name(self, name)     # 通過NAME定位
driver.find_elements_by_class_name(self, name)    # 通過CLASS定位
driver.find_elements_by_link_text(self, class name)    # 通過連結文本定位
driver.find_elements_by_partial_link_text(self, partial link text)    # 通過連結部分文本定位
driver.find_elements_by_tag_name(self, tagname)    # 通過元素标簽定位
driver.find_elements_by_xpath(self, xpath)    # 通過XPATH文法定位
driver.find_elements_by_css_selector(self, css)    # 通過CSS文法定位

# 元素參數話定位
driver.find_element(self, by='id', value=None)
driver.find_elements(self, by='id', value=None)      

轉載于:https://www.cnblogs.com/gxfaxe/p/10579873.html