天天看點

Selenium自動化測試第二天(下)

如有任何學習問題,可以添加作者微信:lockingfree

目錄

  • Selenium自動化測試基礎
  • Selenium自動化測試第一天(上)
  • Selenium自動化測試第一天(下)
  • Selenium自動化測試第二天(上)
  • Selenium自動化測試第二天(下)

動作鍊 模拟滑鼠操作

  • click(): 單擊
  • double_click(): 輕按兩下
  • context_click(): 右擊
  • move_to_element(a): 移動到元素a
  • drag_and_drop(a,b): 拖放,将a拖動到b元素位置
  • click_and_hold(): 單擊并按住滑鼠左鍵 release(): 松開滑鼠
from selenium.webdriver.common.action_chains import ActionChains
...
menu = driver.find_element_by_xpath("//input[@value='下拉菜單']")
ActionChains(driver).move_to_element(menu).perform()
           

示例

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


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
sleep(1)
# driver.find_element_by_link_text("baidu").click()   # 找不到該元素
dropdown = driver.find_element_by_xpath("//input[@value='下拉菜單']")

ActionChains(driver).move_to_element(dropdown).perform()  # 記得使用perform()執行

driver.find_element_by_link_text("baidu").click()


sleep(5)
driver.quit()
           

練習

打開百度->設定->進階搜尋->輸入龍騰育才->搜尋

注意

  1. 不要忘記使用perform()執行操作

Keys模拟鍵盤

from selenium.webdriver.common.keys import Keys
....
input = driver.find_element_by_id("kw")
input.send_keys("龍騰育才")
input.send_keys(Keys.ENTER)
           

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

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
input = driver.find_element_by_id("kw") 
 # 注意不要使用 input = driver.find_element_by_id("kw").send_keys("龍騰育才")
input.send_keys("龍騰育才")
input.send_keys(Keys.ENTER)

sleep(5)
driver.quit()
           

打開百度

  1. 輸入龍騰育才
  2. 倒退2次
  3. 全選 複制 粘貼

截圖

一般用例出錯或失敗時要截圖

  1. save_snapshot(path) get_snapshot_as_file(path) # path是儲存的圖檔路徑

from selenium import webdriver
from time import sleep


driver = webdriver.Chrome()
driver.set_window_size(800,600)
driver.get("http://www.baidu.com")
driver.save_screenshot("d:/1.png")   # 隻支援png格式 等同于 driver.get_screenshot_as_file("d:/2.png")

sleep(5)
driver.quit()
           

  1. 隻支援png格式

等待

  1. 強制等待 time.sleep(5)
  2. 隐性等待(智能等待) driver.implicitly_wait(10) 10s逾時 所有元素定位不到都會等待
  3. 顯性等待(進階用法)

    wait = WebDriverWait(driver,20)

    wait.until(lambda driver: driver.find_element_by_id("...").click())

    每隔一定時間查找并單擊元素,直到找到

使用定位器定位

find_element(*location) By.ID, "kw"

from selenium.webdriver.common.by import By
find_element(By.ID, "")   find_element_by_id("")
find_element(By.NAME, "")  find_element_by_name("")
find_element(By.CLASS_NAME, "")  find_element_by_class_name("")
find_element(By.LINK_TEXT, "")  find_element_by_link_text("")
find_element(By.PARTIAL_LINK_TEXT, "")  find_element_by_partial_link_text("")
find_element(By.PATH, "")  find_element_by_partial_xpath("")
find_element(By.PARTIAL_CSS_SELECTOR, "")  find_element_by_css_selector("")
           
  • ID = "id"
  • XPATH = "xpath"
  • LINK_TEXT = "link text"
  • PARTIAL_LINK_TEXT = "partial link text"
  • NAME = "name"
  • TAG_NAME = "tag name"
  • CLASS_NAME = "class name"
  • CSS_SELECTOR = "css selector"

使用期望條件(except_conditions)

  • presence_of_element_located((By.XPATH,"")): 直到元素出現并能定位到
view = wait.until(EC.presence_of_element_located((By.XPATH,'//td[text()="王五"]/../td[4]/a')))
view.click()
           

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")
# driver.implicitly_wait(10)

wait = WebDriverWait(driver, 20)

# 等待元素出現并操作元素
# wait.until(lambda driver: driver.find_element(By.XPATH, '//*[text()="王五"]/following::td[3]/a').click())

# 相當于 等待出現 再 操作元素  注意 presence_of_element_located((By.ID, ""))  裡面傳一個元祖參數
lookup = wait.until(EC.presence_of_element_located((By.XPATH, '//*[text()="王五"]/following::td[3]/a')))
lookup.click()

sleep(5)
driver.quit()
           

開挂的js

使用js可以修改網頁

  1. 隐藏元素

    selenium預設定位不到隐藏元素

selenium.common.exceptions.ElementNotVisibleException: 
Message: element not visible
           

hide

hidden

hidden="hidden"

style="display: none"

1. 按手工邏輯操作使其顯示再定位

2. 使用js強制改成顯示再定位

# 移除相應屬性
driver.execute_script(
    document.querySelector("#hd1").removeAttribute("hidden");
)
           
  1. 不可輸入/點選(移除readonly/disable屬性)
  2. 拖動滾動條(流加載頁面) document.documentElement.scrollTop=10000;
  3. 富文本框
  4. 更改元素樣式
js2 = '''
var q = document.getElementById("buttonID");
q.value="hello";
q.style.backgroundColor="red";
'''
driver.execute_script(js2)
           
  1. 為一些不好定位的元素添加id
js4='''
'''
    q = document.querySelector("#firstdiv>form>table");
    q.id = "table1";
           

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("http://115.28.108.130/control.html")


# # 1. 滾動頁面  document.documentElement.scrollTop=1000
# # driver.find_element_by_link_text("友情連結").click()   # 不需要滾動頁面頁可以定位到下面的元素(隻要加載了)
# # driver.back()
# js = 'document.documentElement.scrollTop=1000;'   # DTD網頁 否則使用docment.body.scrollTop=1000; 滾動到居上1000像素處
# driver.execute_script(js)  # 可用于處理流頁面
#
# sleep(3)
# # 2. 更改元素樣式 使用 document.getElementById() 得到DOM對象
# js = '''
# document.documentElement.scrollTop=0;
# var q = document.getElementById("buttonID");
# q.style.backgroundColor="red";
#
# '''
# driver.execute_script(js)
#
# sleep(3)
# # 3. 移除readonly/disable/hidden/屬性  使用jquery定位  $(#id)  和getElementById("")得到的DOM對象不同 兩者擁有不同的方法
# js = "document.querySelector('#ro').removeAttribute('readonly')"
# # js = "$('#ro').removeAttribute('readonly')"
# driver.execute_script(js)
# ro = driver.find_element_by_id("ro")
# ro.clear()
# ro.send_keys("成功輸入")
#
# # 或直接使用js修改value
# js = 'document.querySelector("#ro").value="成功輸入"'
# driver.execute_script(js)


# 4. 富文本框輸入

driver.get("http://www.vemmis.com/bjq/index.html")

# js操作iframe 先擷取iframe裡面的window對象,再通過這個對象,擷取到裡面的DOM元素
js = '''
iframe = document.getElementById('ueditor_0');
iframe.contentWindow.document.body.innerHTML="hello";
'''
driver.execute_script(js)

sleep(5)
driver.quit()
           

打開http://115.28.108.130/control.html

  1. 在"哈哈你輸入不了"的輸入框清空并輸入"js開挂" (移除readonly屬性)
  2. 點選"不可點選"按鈕(移除disable屬性)
  3. 為"第一個div"同級的table标簽添加id="table1"

日期控件

1.逐個點選

2.用js修改為可輸入,輸入時間

http://115.28.108.130/date.html

修改為可輸入,并輸入時間

上傳下載下傳

  1. 上傳直接輸入(不能輸入用js修改), 下載下傳直接點選
  2. 借助其他工具

打開http://115.28.108.130/control.html, 上傳檔案

selenium宇宙之外

比如彈出上傳下載下傳windows對話框, flash操作, 儲存網頁

  1. 使用Autoit3/按鍵精靈編寫腳本->生成exe->python執行exe
  2. 使用win32/win32gui操作windows視窗

常見錯誤怎麼處理

  1. 看報什麼錯 1. 元素定位不到 2. 元素不可見
  2. 看有沒有frame/iframe
  3. 操作前 sleep()
  4. 看看元素或者上級/上上級元素是否不可及

此為北京龍騰育才 Python進階自動化(Selenium部分)授課筆記

課程介紹

想要參加現場(北京)/網絡課程的可以聯系作者微信:lockingfree

  1. 高效學習,快速掌握Python自動化所有領域技能
  2. 同步快速解決各種問題
  3. 配套實戰項目練習

繼續閱讀