五、selenium自動化測試之checkbox和下拉框處理


checkbox批量勾選

1.環境准備

下面代碼用記事本編輯,保存為.html格式,並放在python項目同一目錄下。(此段代碼非原創,來源某課程)

 

 

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkbox</title>
<script type="text/javascript" async="
" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"
rel="stylesheet" />
<script src="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1</label>
<div class="controls">
<input type="checkbox" id="c1" />
</div>
</div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2</label>
<div class="controls">
<input type="checkbox" id="c2" />
</div>
</div>
<div class="control-group"><label class="control-label" for="c3">checkbox3</label>
<div class="controls">
<input type="checkbox" id="c3" />
</div>
</div>
</form>
</div>
</body>
</html>
from selenium import webdriver
import time
import os

if __name__ == "__main__":
    firefox_driver = webdriver.Firefox()
    path = "file:///" + os.path.abspath("checkbox.html")  # 獲取當前路徑下的文件
    firefox_driver.get(path)
    checkboxs = firefox_driver.find_elements_by_css_selector("input[type=checkbox]")  # 這里獲取到一組元素,返回list
    time.sleep(2)
    for checkbox in checkboxs:
        checkbox.click()  # 批量勾選
    time.sleep(2)
    firefox_driver.quit()

 

下拉框處理

下拉框處理之SELECT類
需要導入from selenium.webdriver.support.select import Select
a.選擇某一項
eg.

<option value="foo">Bar</option>
select_by_index() 通過索引定位
select_by_value('foo') 通過value值定位
select_by_visible_text('') 通過文本值定位,即顯示在標簽中間的值
eg.
Select(firefox_driver.find_element_by_css_selector("select#ShippingMethod")).select_by_visible_text('UPS Next Day Air ==> $12.51')
如果找不到,會拋NoSuchElementException異常
b.獲取options信息(屬性函數)
options 返回所有選項元素列表
all_selected_options:提供所有被選中選項的元素列表
first_selected_option:提供第一被選中的選項元素?存疑
c.取消選中項
deselect_all()             # 取消全部的已選擇項,僅當select支持多選時生效,否則會拋NotImplementedErroe異常
deselect_by_index        # 取消已選中的索引項
deselect_by_value        # 取消已選中的value值
deselect_by_visible_text # 取消已選中的文本值

實例

1.先試下一個平平凡凡的select

 

 

 方法1.select定位

Select(firefox_driver.find_element_by_css_selector("select#ShippingMethod")).select_by_visible_text('UPS Next Day Air ==> $12.51')

方法2.直接定位

firefox_driver.find_element_by_css_selector("option[value='12.51']").click()

2.如果下拉選擇框,不是select標簽定義的?

以百度首頁為例

2.1 可以看到鼠標移動到[設置]后,出現選項,但是這並不是一個select,鼠標移動到[設置]后,一些屬性值也會發生變化。這里如何定位呢?(比較好奇這里的原理,看來前端知識要繼續補充)

 

 

 

firefox_driver = webdriver.Firefox()
    # path = "file://" + os.path.abspath("select.html")  # 獲取當前路徑下的文件
    # firefox_driver.get(path)
    firefox_driver.get("https://www.baidu.com/")
    time.sleep(2)
    el = firefox_driver.find_element_by_css_selector("a.lb+a.pf")
    ActionChains(firefox_driver).move_to_element(el).perform()
    time.sleep(1)
    # el2 = firefox_driver.find_element_by_css_selector("a.pf hover")  # 這里報錯了
    # el2.find_element_by_class_name("setpref").click()  
    firefox_driver.find_element_by_link_text("搜索設置").click()
    time.sleep(3)
    firefox_driver.quit()

2.2 百度首頁輸入框的這個下拉選擇框,如何選擇歷史記錄或者輸入一部分內容后,選擇檢索出來的選擇列表框呢?留個疑問,明天繼續~

 

 

 

今天發現百度首頁的布局變了,好吧,UI自動化是個巨大的坑....補上新的截圖

 

 

 

可以觀察到[div]這個節點有個屬性display:none,指的是這個塊元素是隱藏不可見的,並且class是有三個值,try path測試,CSS選擇器定位,定位時可以分別使用三個值,如果三個值一起使用會定位不到。沒關系,我先來試試。

a.直接定位

# 先找到input,然后點擊,再定位選項。失敗了....NoSuchElementException
# input1 = firefox_driver.find_element_by_css_selector("input#kw").click()
# time.sleep(2)
# ul = firefox_driver.find_element_by_class_name("bdsug-new")

b.js改屬性display為block

# 編寫js代碼,更改隱藏元素的display屬性,再繼續下面的定位
firefox_driver.execute_script('document.getElementsByClassName("bdsug-new")[0].style.display="block";') # 
input1 = firefox_driver.find_element_by_css_selector("input#kw").click()
time.sleep(2)
ul = firefox_driver.find_element_by_css_selector("ul")
報錯:Message: TypeError: document.getElementsByClassName(...)[0] is undefined
分析定位:
document.getElementsByClassName("bdsug bdsug-new")返回的值是None。
問題一:為什么返回的是None呢?
是否是條件不對?class=bdsug bdsug-new bdsugbg,三個值都試了下,並且換成其他元素的值,也是定位不到。
其他原因?執行js代碼的時候,DOM元素還未加載。存疑,待驗證。
div1 = firefox_driver.execute_script('window.onload=function(){a=document.getElementsByClassName("bdsug-new");return a;}')
拿到的div1值依然是None。求助論壇ing



免責聲明!

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



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