python+selenium進行元素定位

API講解

  • coding = utf-8
    可加可不加,開發人員喜歡加一下,防止亂碼。

  • from selenium import webdriver
    要想使用selenium 的webdriver 裏的函數,首先把包導進來

  • browser = webdriver.Firefox()
    我們需要操控哪個瀏覽器呢?Chrome ,當然也可以換成Ie 或Firefox。browser 可以隨便取,但後面要用它操縱各種函數執行。

  • browser.find_element_by_id(“kw”).send_keys(“selenium”)
    一個控件有若干屬性id 、name、(也可以用其它方式定位),百度輸入框的id 叫kw ,我要在輸入框裏輸入selenium 。

  • browser.find_element_by_id(“su”).click()
    搜索的按鈕的id 叫su ,我需要點一下按鈕( click() )。

  • browser.quit()
    退出並關閉窗口的每一個相關的驅動程序。

  • browser.close()
    關閉當前窗口。

close方法關閉當前的瀏覽器窗口,quit方法不僅關閉窗口,還會徹底的退出webdriver,釋放與driver server之間
的連接。所以簡單來說quit是更加徹底的close,quit會更好的釋放資源

元素的定位

對象的定位應該是自動化測試的核心,要想操作一個對象,首先應該識別這個對象。一個對象就是一個人一樣,他
會有各種的特徵(屬性),如比我們可以通過一個人的身份證號,姓名,或者他住在哪個街道、樓層、門牌找到這
個人。
那麼一個對象也有類似的屬性,我們可以通過這個屬性找到這對象。

webdriver 提供了一系列的對象定位方法,常用的有以下幾種
1.id
2.name
3.class name
4.link text
5.partial link text
6.tag name
7.xpath
8.css selector
這是一個百度輸入框的html

<input id="kw" class="s_ipt" type="text" maxlength="100" name="wd" autocomplete="off">
#coding=utf-8
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#########百度輸入框的定位方式##########
#通過id 方式定位
browser.find_element_by_id("kw").send_keys("selenium")
#通過name 方式定位
browser.find_element_by_name("wd").send_keys("selenium")
#通過tag name 方式定位
browser.find_element_by_tag_name("input").send_keys("selenium") 不能成功,因爲input太多了不唯一。
#通過class name 方式定位
browser.find_element_by_class_name("s_ipt").send_keys("selenium")
#通過CSS 方式定位
browser.find_element_by_css_selector("#kw").send_keys("selenium")
#通過xphan 方式定位
browser.find_element_by_xpath("//[@id='kw']").send_keys("selenium")
############################################
browser.find_element_by_id("su").click()
time.sleep(3)
browser.quit()

id 和name 定位
id 和name 是我們最最常用的定位方式,因爲大多數控件都有這兩個屬性,而且在對控件的id 和name 命名時一般使其有意義也會取不同的名字。通過這兩個屬性使我們找一個頁面上的屬性變得相當容易。

tag name 和class name 定位
從上面的百度輸入框的屬性信息中,我們看到,不單單隻有id 和name 兩個屬性, 比如class 和tag name(標籤名)
input 就是一個標籤的名字,可以通find_element_by_tag_name(“input”) 函數來定位。
class=“s_ipt”,通過find_element_by_class_name(“s_ipt”)函數捕獲百度輸入框。

XPath 定位
XPath 是一種在XML 文檔中定位元素的語言。因爲HTML 可以看做XML 的一種實現,所以selenium 用戶可是使用這種強大語言在web 應用中定位元素。

link text定位
有時候不是一個輸入框也不是一個按鈕,而是一個文字鏈接,我們可以通過link。

#coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_link_text("hao123").click()
browser.quit()

Partial link text 定位
通過部分鏈接定位,這個有時候也會用到,我還沒有想到很好的用處。拿上面的例子,我可以只用鏈接的一部分文字進行匹配。

coding=utf-8
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
browser.find_element_by_partial_link_text("hao").click()
browser.quit()

操作測試對象

一般來說,webdriver 中比較常用的操作對象的方法有下面幾個:

  • click 點擊對象
  • send_keys 在對象上模擬按鍵輸入
  • clear 清除對象的內容,如果可以的話
  • submit 提交表單
  • text 用於獲取元素的文本信息
driver.find_element_by_id("su").submit()
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").submit()
data=driver.find_element_by_id("cp").text
print(data)
time.sleep(3)
driver.quit()

添加等待

  • time.sleep(5)
  • driver.implicitly_wait(5) 智能等待

瀏覽器的操作

瀏覽器最大化

browser.maximize_window()

設置瀏覽器寬、高

browser.set_window_size(480, 800)

操作瀏覽器的前進、後退

# 後退到上一個頁面
browser.back()
# 前進到下一個頁面
browser.forward()

控制瀏覽器滾動條

#將頁面滾動條拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#將滾動條移動到頁面的頂部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

鍵盤事件

鍵盤按鍵用法

driver.find_element_by_id("account").send_keys(Keys.TAB)
driver.find_element_by_name("password").send_keys(Keys.ENTER)

鍵盤組和用法

#ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)

鼠標事件

ActionChains 類:

  1. context_click() 右擊
  2. double_click() 雙擊
  3. drag_and_drop() 拖動
  4. move_to_element() 移動
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右鍵
ActionChains(driver).double_click(qqq).perform() #雙擊
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移動到的目標位置
target = driver.find_element_by_class_name("btn")
#執行元素的移動操作
ActionChains(driver).drag_and_drop(element, target).perform()

定位一組元素

inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()

多層框架/窗口定位

switch_to_frame()
switch_to_window()

#先找到到ifrome1(id = f1)
browser.switch_to_frame("f1")
#再找到其下面的ifrome2(id =f2)
browser.switch_to_frame("f2")
#下面就可以正常的操作元素了

多層窗口定位

有可能嵌套的不是框架,而是窗口,還有真對窗口的方法:switch_to_window
用法與switch_to_frame 相同:
driver.switch_to_window(“windowName”)

層級定位

具體思路是:先點擊顯示出1個下拉菜單,然後再定位到該下拉菜單所在的ul,再定位這個ul 下的某個具體的link。
在這裏,我們定位第1個下拉菜單中的Action 這個選項

#點擊Link1鏈接(彈出下拉列表)
dr.find_element_by_link_text('Link1').click()
#在父親元件下找到link 爲Action 的子元素
menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
#鼠標定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()

下拉框處理

#先定位到下拉框
m=driver.find_element_by_id("ShippingMethod")
#再點擊下拉框下的選項
m.find_element_by_xpath("//option[@value='10.69']").click()

alert、confirm、prompt 的處理

  • text 返回alert/confirm/prompt 中的文字信息
  • accept 點擊確認按鈕
  • dismiss 點擊取消按鈕,如果有的話
  • send_keys 輸入值,這個alert\confirm 沒有對話框就不能用了,不然會報錯
alert = dr.switch_to_alert()
alert.accept()
alert.dismiss()
alert.send_keys("hello word")

DIV對話框的處理

# 打開對話框
dr.find_element_by_id('show_modal').click()
sleep(3)
# 點擊對話框中的鏈接
link = dr.find_element_by_id('myModal').find_element_by_id('click')
link.click()
sleep(4)
# 關閉對話框
buttons =dr.find_element_by_class_name('modal-footer').find_elements_by_tag_name('button')
buttons[0].click()

上傳文件操作

#定位上傳按鈕,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\PycharmProjects\\test\\upload.txt')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章