unittest詳解(三) 簡單元素定位

1、8種簡單對象定位屬性:javascript

  • · id
  • · name
  • · class name
  •  .tag name
  • · link text
  • · partial link text
  • · xpath
  • · css selector

這8種定位方式在Python selenium中所對應的方法爲:css

  • find_element_by_id()
  • find_element_by_name()
  • find_element_by_class_name()
  • find_element_by_tag_name()
  • find_element_by_link_text()
  • find_element_by_partial_link_text()
  • find_element_by_xpath()
  • find_element_by_css_selector()

 定位方法:html

  webdriver能夠很方便的使用findElement方法來定位某個特定的對象,若是須要定位一組對象,這時候就須要使用findElements方法。java

層級定位:web

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
import os
dr = webdriver.Chrome()
file_path =  'file://' + os.path.abspath('test.html')
dr.get(file_path)
#點擊Link1連接(彈出下拉列表)
dr.find_element_by_link_text('Link1').click()
#找到id 爲dropdown1的父元素
WebDriverWait(dr, 10).until(lambda the_driver: the_driver.find_element_by_id('dropdown1').is_displayed())
#在父親元件下找到link爲Action的子元素
menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
#鼠標定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()
time.sleep(2)
dr.quit()

 定位思路:chrome

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

     WebDriverWait(dr, 10)    10秒內每隔500毫秒掃描1次頁面變化,當出現指定的元素後結束。框架

  is_displayed() 該元素是否用戶能夠見函數

    ActionChains(driver)   生成用戶的行爲。全部的行動都存儲在actionchains對象。經過perform()存儲的行爲。測試

  move_to_element(menu)  移動鼠標到一個元素中,menu上面已經定義了他所指向的哪個元素。

  to_element:元件移動到。

    perform()  執行全部存儲的行爲

   「下拉列表中Action選項處於被選中狀態」,經過鼠標移動到選項上就達到到了這種效果,但經過程序模擬確實比較麻煩

 

基礎操做:

self.driver.implicitly_wait(30)
driver.maximize_window()     #窗口最大化
#driver.set_window_size(1366, 768)    #參數數字爲像素點
driver.switch_to_window(driver.window_handles[1])       #此行代碼用來定位當前頁面
title=driver.title   # 獲取頁面title 
url = driver.current_url   #獲取當前頁面url.
browser.back()
browser.forward()

智能等待:

  implicitly_wait() 它的用法應該比time.sleep() 更智能,後者只能選擇一個固定的時間的等待,前者能夠在一個時間範圍內智能的等待。

 

2、簡單元素操做:

  • · click() 點擊對象
  • · send_keys('xxxx') 在對象上模擬按鍵輸入
  • · clear()  清除對象的內容,若是能夠的話

 

3、WebElement  接口操做:

  • · text  獲取該元素的文本
  •  .size #獲取元素的大小
  •  .title  #獲取網頁title
  • · submit()  提交表單
  • · get_attribute('xxxx')  得到屬性值
  •  .s_selected(self) #元素是否被選擇
  •  .is_enabled() #元素是否被啓用
  •  .find_element_by_id("kw").is_displayed() #獲取元素是否可見,值爲True或False

 

4、鼠標操做:雙擊,鼠標右鍵,鼠標移動,拖動到元素上等操做:

  ActionChains(driver):存儲鼠標的操做

  perform():對指定的鼠標操做的執行

右擊圖標:

  from selenium.webdriver.common.action_chains import ActionChains

  imei=driver.find_element_by_css_selector(" ").click()

  ActionChains(driver).context_click(imei).perform() #鼠標右鍵

  ActionChains(driver).click_and_hold("imei").perform()             #鼠標左鍵

  ActionChains(driver).double_clcik("imei").perform()             #鼠標雙擊

  ActionChains(driver).move_to_element("imei").perform()            #鼠標移動到某個元素上

  ActionChains(driver).drag_and_drop(start,end).perform()           #鼠標拖動某個元素從start位置到end的位置

 

5、鍵盤操做:

鍵盤的操做基於send_keys()方法

  from selenium.webdriver.common.Keys import Keys

  driver.find_element_by_id("kw").send_keys(KEY.BACK_SPACE) #刪除鍵 driver.find_element_by_id("kw").send_keys(KEY.ENTER) #回車鍵   

  driver.find_element_by_id("kw").send_keys(KEY.SPACE) #空格鍵 driver.find_element_by_id("kw").send_keys(KEY.TAB) #製表符

  driver.find_element_by_id("kw").send_keys(KEY.ESCAPE) #退出鍵 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'a') #全選

  driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'c') #複製 driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'v') #粘貼

  driver.find_element_by_id("kw").send_keys(KEY.CONTROL,'x') 剪切

 

6、下拉框multiple select:

  from selenium.webdriver.support.ui import Select

  # 首先找到須要選擇的multiple select元素,實例化一個Select類

  select = Select(self.driver.find_element_by_xpath('//*[@id="Root_sourcetype"]'))

  select.deselect_all() # multiple select元素所有取消選擇

  select.select_by_index(0) # 選擇multiple select元素中第一個選項

  select.select_by_value("test") #選擇下拉框value爲test的選項

  select.select_by_visible_text("測試") # 經過選項文字進行選擇

  

7、多層框架定位

有些頁面的框架嵌套着另外一個框架,若是須要定位被嵌套的框架裏的內容則能夠先定位到外部框架,再定位到被嵌套的框架,而後就能夠定位裏面的頁面元素,其實這個思路和定位層級元素是同樣的,只是這裏用到定位框架的語句須要記下

switch_to_frame(id)

例如:框架A嵌套這框架B,如今須要定位框架B中的文本框

switch_to_frame(id = a) switch_to_frame(id = b) find_element_by_id("textboxid")

 定位彈出的框架後操做完成須要跳出框架才能夠定位原先頁面上的元素。

driver.switch_to_frame("layui-layer-iframe1") #定位框架 driver.switch_to_default_content() 跳出框架

switch_to.default_content() #跳回最外層的頁面 driver.find_element_by_xpath("html/body")

 

8、多層窗口定位

瀏覽器窗口的切換經過句柄(handle)來操做,每一個窗口都有一個句柄,表明當前窗口,須要操做哪一個頁面的窗口,切換到窗口對應的句柄。

打開多個頁面時,分別獲取對應handle值,經過handle進行切換頁面:

#定位當前頁面:

handle1=driver.current_window_handle

switch_to_window( handle1)

#同一個瀏覽器多個窗口,指定定位到第一個瀏覽器窗口:

handle2=driver.window_handles[0]

switch_to_window(handle2)

#獲取全部頁面的句柄:hs=driver.window_handles

 

9、JS彈出對話框

在實際系統中,在完成某些操做時會彈出對話框來提示,主要分爲"警告消息框","確認消息框","提示消息對話"三種類型的對話框。

1.警告消息框(alert)

  警告消息框提供了一個"肯定"按鈕讓用戶關閉該消息框,而且該消息框是模式對話框,也就是說用戶必須先關閉該消息框而後才能繼續進行操做。

2.確認消息框(confirm)

  確認消息框向用戶提示一個"是與否"問題,用戶能夠根據選擇"肯定"按鈕和"取消"按鈕。

3.提示消息對話(prompt)

selenium 提供switch_to_alert()方法定位到 alert/confirm/prompt對話框。使用 text/accept/dismiss/send_keys 進行操做,這裏注意的是send_keys只能對prompt進行操做。

alert = driver.switch_to_alert() #定位彈出對話 print (alert.text) #打印警告對話框內容 alert.accept() alert.dismiss() #至關於點擊"確認"或取消.

 

10、JS滾動條

scrollTo函數:不存在兼容性問題。

--scrollHeight 獲取對象的滾動高度。 

--scrollLeft 設置或獲取位於對象左邊界和窗口中目前可見內容的最左端之間的距離。 

--scrollTop 設置或獲取位於對象最頂端和窗口中可見內容的最頂端之間的距離。 

--scrollWidth 獲取對象的滾動寬度。

## 回到頂部

def scroll_top():
    if driver.name == "chrome":
       js = "var q=document.body.scrollTop=0"
    
else:
        js = "var q=document.documentElement.scrollTop=0"
    
return driver.execute_script(js)

#拉到底部

def scroll_foot():
   if driver.name == "chrome":
        js = "var q=document.body.scrollTop=10000"
    
else:
        js = "var q=document.documentElement.scrollTop=10000"
    
return driver.execute_script(js)

#滾動到底部

js = "window.scrollTo(0,document.body.scrollHeight)" 

driver.execute_script(js)

#滾動到頂部

js = "window.scrollTo(0,0)" 

driver.execute_script(js)

經過javascript設置瀏覽器窗口的滾動條位置 js="window.scrollTo(100,450);" driver.execute_script(js)

聚焦元素

target = driver.find_element_by_xxxx()

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

 

 11、input標籤文件上傳

input標籤是能夠直接send_keys.

self.driver = webdriver.Chrome()

driver.find_element_by_css_selector("#uploadTask").send_keys("G:/data.xlsx")

相關文章
相關標籤/搜索