自動化測試 python2.7 與 selenium 2 學習

windows環境搭建css

# 下載 python【python 開發環境】
http://python.org/getit/
# 下載 setuptools 【python 的基礎包工具】setuptools 是 python 的基礎包工具,能夠幫助咱們輕鬆的下載,構建,安裝,升級,卸載 python的軟件包。 http://pypi.python.org/pypi/setuptools
# 下載 pip 【python 的安裝包管理工具】pip 是python軟件包的安裝和管理工具, 有了這個工具, 咱們只須要一個命令就能夠輕鬆的python 的任意類庫。 https://pypi.python.org/pypi/pip

selenium2 python自動化測試.pdf html

http://pan.baidu.com/s/1c249j9I

 

知識點與坑爹記錄:前端

一、webdriver的find_element_by_css_selector 不支持:first 和 :last選擇器。但支持nth-child(n) 和 屬性選擇器等 css選擇器耶!python

二、通過一系列試驗,firefox瀏覽器保持52版本能解決大部分的問題。
mysql

三、進入 C:\Windows\System32\drivers\etc 查看houst 你的 localhost 是否是 127.0.0.1c++

四、多行字符串變量能夠用'''xxxxx''' 來定義git

五、正則表達式,千萬不要使用re.match,簡直是坑爹,應該用re.search來使用正則表達式。github

http://www.runoob.com/python/python-reg-expressions.htmlweb

re.match只匹配字符串的開始,若是字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。正則表達式

abc = re.search('(^<option)(.*)四川省(</option>)$', aa, re.M|re.I)
print(abc)
if abc:
    print('OK')

 六、關於lambda表達式的一個技巧,可使用or或者and來組合。而lambda最終返回的,是最後一個表達式,譬如這樣:

g = lambda x: 1==1 and x + 1
g(1) // => 2

 能夠看出,and後面的會做爲返回值。因此咱們能夠借用這點搞事情。

七、神級坑爹API: find_elements_by_css_selector 和 find_element_by_css_selector 你看的出這二者的區別麼? 前者能夠返回多個WebElement對象。因此他可使用len(xxxxx)。然後者因爲不具有,會報【「TypeError: object of type 'FirefoxWebElement' has no len()」】。因此使用前者纔是正確的。

八、宙斯級別的坑爹bug修補記錄:(幫春梅解決HTMLTestRunner的問題,爲何個人代碼運行好好的,一到他那就出事了?)

緣由是目前捕捉到是由於pycharm致使的。確定是進行了什麼配置,纔會致使出現問題。若是我使用命令行python xxx.py的方式溫如狗!

這就能解釋爲何有一些代碼以很是崎嶇怪異的方式運行。(譬如類直接運行?不須要調用和實例化?PY傻逼了?在逗開發者?)

不知其它代碼問題是否正常,暫時先解決HTMLTestRunner 。

 

第一步、安裝 python 的開發環境

python2.7.5版本,安裝目錄爲:C:\Python27

添加一下 python 的環境變量吧!桌面「個人電腦」
右鍵菜單-->屬性-->高級-->環境變量-->系統變量中的添加Path

一、C:\Python27

二、 C:\Python27\Scripts

第二步安裝 pip

解壓pip-9.0.1.tar.gz, 打開命令提示符 (開始--運行--cmd 命令, 回車) 進入 pip-9.0.1目錄下輸入:

python setup.py install

再切換到 C:\Python27\Scripts 目錄下輸入:

./easy_install pip

第三步、安裝 selenium

在 C:\Python27\Scripts 下輸入命令安裝:

./pip install -U selenium

進入python命令行,使用from selenium import webdriver 測試咱們的 selenium 安裝是否成功。沒有報錯則是成功:

第四步、下載firefox火狐瀏覽器,儘可能低版本,推薦52.0便可。兼容性較強,不必追求高版本.更關鍵是,我踩太低版本如47的坑和最高版本58的坑。

才發現52這個版本比較安全。

http://ftp.mozilla.org/pub/firefox/releases/52.0/win64/zh-CN/

第五步:下載geckodriver.exe

https://github.com/mozilla/geckodriver/releases

放在C:\Python27(查看環境變量path中是否添加C:\Python27該路徑)

 

進入 C:\Windows\System32\drivers\etc 查看houst 你的 localhost 是否是 127.0.0.1

進入 C:\Windows\System32\drivers\etc 查看houst 你的 localhost 是否是 127.0.0.1

進入 C:\Windows\System32\drivers\etc 查看houst 你的 localhost 是否是 127.0.0.1

 

第一個自動化測試demo

# coding = utf-8
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
# browser.quit()

輸入完成後命令爲 baidu.py 保存, 按 F5 快捷鍵運行腳本, 將看到腳本啓動 Firefox 瀏覽器進入百度頁,輸入「selenium」 點擊搜索按鈕,最後關閉瀏覽器的過程。 (這裏默認讀者已經安裝了 Firefox 瀏覽器)

 

事實上不止是火狐,IE(edge)、chrome、Safari 等瀏覽器均可以被支持,只須要下載對應的Driver而且放置在C:\Python27(查看環境變量path中是否添加C:\Python27該路徑), 就可使用了。各類Driver下載地址以下:

http://seleniumhq.github.io/selenium/docs/api/py/#drivers

下面演示如下使用Chrome瀏覽器進行自動化測試:

chromeDriver下載地址

https://sites.google.com/a/chromium.org/chromedriver/downloads

老規矩:下載好chrome瀏覽器,將chromeDriver放置再C:\Python27中

而後將上面代碼中的 Firefox() 換成 Chrome() ,而後F5運行測試一下。發現此次是chrome瀏覽器來運行自動化測試了

 

 

 

查看python官方文檔和第三方API文檔的方法:

http://www.cnblogs.com/paisen/p/3298269.html

# 打開cmd命令行,輸入:
python -m pydoc -p 6634

打開瀏覽器:localhost:6666 能夠看到大量的文檔

往下滑動,能夠看到各類各樣的目錄。找到相似 C:\python27\lib\site-packages 的地方,就是咱們的第三方文檔了,其中包括咱們剛剛下載的selenium

 

 

API瀏覽器篇

一、瀏覽器最大化

在統一的瀏覽器大小下運行用例,能夠比較容易的跟一些基於圖像比對的工具進行結合,提高測試的
靈活性及廣泛適用性。好比能夠跟 sikuli 結合,使用 sikuli 操做 flash。

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
print "瀏覽器最大化"
driver.maximize_window() #將瀏覽器最大化顯示
# driver.quit()

二、設置瀏覽器寬、高

在不一樣的瀏覽器大小下訪問測試站點,對測試頁面截圖並保存,而後觀察或使用圖像比對工具對被測
頁面的前端樣式進行評測。好比能夠將瀏覽器設置成移動端大小(320x480),而後訪問移動站點,對其樣
式進行評估;

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("http://m.mail.10086.cn")
#參數數字爲像素點
print "設置瀏覽器寬480、高800顯示"
driver.set_window_size(480, 800)
# driver.quit()

三、控制瀏覽器前進、後退

瀏覽器上有一個後退、前進按鈕,對於瀏覽網頁的人是比較方便的;對於 web 自動化測試來講是
一個比較難模擬的操做; webdriver 提供了 back()和 forward()方法, 使實現這個操做變得很是簡單。

#coding=utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
#訪問百度首頁
first_url= 'http://www.baidu.com'
print "now access %s" %(first_url)
driver.get(first_url)
#訪問新聞頁面
second_url='http://news.baidu.com'
print "now access %s" %(second_url)
driver.get(second_url)
#返回(後退)到百度首頁
print "back to %s "%(first_url)
driver.back()
#前進到新聞頁
print "forward to %s"%(second_url)
driver.forward()
# driver.quit()

 

API對象定位篇

webdriver 提供了一系列的元素定位方法,經常使用的有如下幾種

 id
 name
 class name
 tag name
 link text
 partial link text
 xpath
 css selector

分別對應 python webdriver 中的方法爲:
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()

 

一、id 和 和 name 定位
id 和 name 是咱們最經常使用的定位方式, 由於大多數元素都有這兩個屬性, 並且在對控件的 id 和 name
命名時通常使其有意義也會取不一樣的名字。經過這兩個屬性使咱們找一個頁面上的屬性變得至關容易。

<input id="gs_htif0" class="gsfi" aria-hidden="true" dir="ltr">
<input type="submit" name="btnK" jsaction="sf.chk" value="Google 搜索">
<input type="submit" name="btnI" jsaction="sf.lck" value=" 手氣不錯 ">

經過元素中所帶的 id 和 name 屬性對元素進行定位:

id=」 gs_htif0 」
find_element_by_id(" gs_htif0 ")
name=」btnK」
find_element_by_name("btnK")
name=」btnI」
find_element_by_name("btnI")

二、tag name 和 和 class name 定位

不是全部的前端開發人員都喜歡爲每個元素添加 id 和 name 兩個屬性,但除此以外你必定發現了一
個元素不僅僅只有 id 和 name,它還有 class 屬性;並且每一個元素都會有標籤。

<div id="searchform" class="jhp_big" style="margin-top:-2px">
<form id="tsf" onsubmit="return name="f" method="GET" action="/search">
<input id="kw" class="s_ipt" type="text" name="wd" autocomplete="off">

經過元素中帶的 class 屬性對元素進行定位:

class=」jhp_big」
find_element_by_class_name("jhp_big")
class=」s_ipt」
find_element_by_class_name("s_ipt")

經過 tag 標籤名對對元素進行定位:

<div> find_element_by_tag_name("div")
<form> find_element_by_tag_name("form")
<input> find_element_by_tag_name("input")

tag name 定位應該是全部定位方式中最不靠譜的一種了,由於在一個頁面中具備相同 tag name 的元
素極其容易出現。

三、link text 與 與 partial link text 定位

有時候須要操做的元素是一個文字連接, 那麼咱們能夠經過 link text 或 partial link text 進行元素
定位。

<a href="http://news.baidu.com" name="tj_news">新 聞</a>
<a href="http://tieba.baidu.com" name="tj_tieba">貼 吧</a>
<a href="http://zhidao.baidu.com" name="tj_zhidao">一個很長的文字鏈接</a>

經過 link text 定位元素:

find_element_by_link_text("新 聞")
find_element_by_link_text("貼 吧")
find_element_by_link_text("一個很長的文字鏈接")

通 partial link text 也能夠定位到上面幾個元素:

find_element_by_partial_link_text("新")
find_element_by_partial_link_text("吧")
find_element_by_partial_link_text("一個很長的")

當一個文字鏈接很長時,咱們能夠只取其中的一部分,只要取的部分能夠惟一標識元素。通常一個頁

面上不會出現相同的文件連接,經過文字連接來定位元素也是一種簡單有效的定位方式。

 

下面介紹 xpath 與 CSS 定位相比上面介紹的方式來講比較難理解,但他們的靈活性與定位能力比上
面的方式要強大。

四、xpath定位

 XPath 擴展了上面 id 和 name 定位方式,提供了不少種可能性,好比定位頁面上的第三個多選框。

<html class="w3c">
<body>
<div class="page-wrap"></div>
  <div id="hd" name="q">
   <form target="_self" action="http://www.so.com/s">
    <span id="input-container">
            <input id="input" type="text" x-webkit-speech="" autocomplete="off" suggestwidth="501px" />
        </span>
     </form>
</div>

絕對路徑定位:
find_element_by_xpath(" /html/body/div[2]/form/span/input ")

在瀏覽器F12的console中,使用$x("/html/body/div[2]/form/span/input") 能夠測試

相對路徑定位:
find_element_by_xpath(" //input[@id=’input’] ") #經過自身的 id 屬性定位
find_element_by_xpath(" //span[@id=’input-container’]/input ") #經過上一級目錄的id屬性定位
find_element_by_xpath(" //div[@id=’hd’]/form/span/input ") #經過上三級目錄的 id 屬性定位
find_element_by_xpath(" //div[@name=’q’]/form/span/input ")#經過上三級目錄的 name 屬性定位
經過上面的例子,咱們能夠看到 XPath 的定位方式很是靈活和強大的,並且 XPath 能夠作布爾邏輯運
算,例如://div[@id=’hd’ or @name=’q’]

 

值得一提的是xpath的獲取能夠經過chromeF12,elements中的源代碼右鍵->copy->copy Xpath

或者firefox瀏覽器的firebug工具中Copy Xpath 獲取

 

五、CSS選擇器

沒啥好說的。最靈活經常使用的選擇器,詳情請自行學習CSS相關資料

 

API操做對象篇

前面講到了很多知識都是定位對象,定位只是第一步,定位以後須要對這個對象進行操做。鼠標點擊
呢仍是鍵盤輸入,這要取決於咱們定位的對象所支持的操做。

通常來講,全部有趣的操做與頁面交互都將經過 WebElement 接口,包括上一節中介紹的對象定位,
以及本節中須要介紹的常對象操做。
webdriver 中比較經常使用的操做元素的方法有下面幾個:
 clear 清除元素的內容,若是能夠的話
 send_keys 在元素上模擬按鍵輸入
 click 單擊元素
 submit 提交表單

 

360雲盤登錄實例

#coding=utf-8
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://eyun.360.cn/")
driver.find_element_by_class_name("quc-input-account").clear()
driver.find_element_by_class_name("quc-input-account").send_keys("13713332652")
driver.find_element_by_class_name("quc-input-password").clear()
driver.find_element_by_class_name("quc-input-password").send_keys("123456789")
driver.find_element_by_class_name("quc-submit").click()
#經過 submit() 來提交操做
#driver.find_element_by_id("dl_an_submit").submit()
# driver.quit()

 

WebElement 接口經常使用方法
WebElement 接口 除了咱們前面介紹的方法外 ,它還包含了別一些有用的方法。下面,咱們例舉例幾
個比較有用的方法。


size 返回元素的尺寸。例:

#返回百度輸入框的寬高
size=driver.find_element_by_id("kw").size
print size

 

text 獲取元素的文本,例:

#返回百度頁面底部備案信息
text=driver.find_element_by_id("cp").text
print text

 

get_attribute(name) 得到屬性值。例:
須要說明的是這個方法在定位一組時將變得很是有用,後面將有運行的實例。

#返回元素的屬性值,能夠是 id、name、type 或元素擁有的其它任意屬性
attribute=driver.find_element_by_id("kw").get_attribute('type')
print attribute

 

is_displayed() 設置該元素是否用戶可見。例:

#返回元素的結果是否可見,返回結果爲 True 或 False
result=driver.find_element_by_id("kw").is_displayed()
print result

 

WebElement 接口的其它更多方法請參考 webdriver API。

 

鼠標事件
前面例子中咱們已經學習到能夠用 click()來模擬鼠標的單擊操做,而咱們在實際的 web 產品測試中
發現,有關鼠標的操做,不僅僅只有單擊,有時候還要和到右擊,雙擊,拖動等操做,這些操做包含在
ActionChains 類中。
ActionChains 類鼠標操做的經常使用方法:
 context_click() 右擊
 double_click() 雙擊
 drag_and_drop() 拖動
 move_to_element() 鼠標懸停在一個元素上
 click_and_hold() 按下鼠標左鍵在一個元素上

 

等待某個元素直到出現,而後再操做或者進一步邏輯判斷

http://localhost:6634/selenium.webdriver.support.wait.html#WebDriverWait

一、等待而且直接操做

from selenium.webdriver.support.wait import WebDriverWait

 WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('/html/body/div[4]/div[1]/div/ul/li[3]/ul/li[2]/a')).click()

二、等待結果而且返回bool

 is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id("someId").is_displayed())

 

python 和 mysql鏈接

蟲師教程:http://www.cnblogs.com/fnng/p/3565912.html

第一步,下載源代碼:

# 請下載zip源代碼,這樣才能夠編譯
https://pypi.python.org/pypi/MySQL-python/1.2.5

# 個人版本從2.7升級到3.5.2的時候,上面那個就無效了。我使用了這個
https://pypi.python.org/pypi/PyMySQL

第二步,解壓而且進入目錄,輸入編譯命令:python setup.py install

若是編譯有問題,根據指示解決

1、如須要c++
   https://www.microsoft.com/en-us/download/confirmation.aspx?id=44266

2、若是出現這個錯誤:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory error: command 'C:\\Users\\qinwanxia\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\cl.exe' failed with exit status 2
   須要下載並安裝MySQL connector 32位,系統是64位的也須要安裝32位: 
  https://dev.mysql.com/downloads/connector/c/6.0.html#downloads

第三步,進入python命令行模式,檢查是否包是否可引用:

python

import MySQLdb

第四步,在程序中使用mysql:

五,python 操做mysql數據庫基礎

複製代碼
#coding=utf-8
import MySQLdb

conn= MySQLdb.connect(
        host='localhost',
        port = 3306,
        user='root',
        passwd='123456',
        db ='test',
        )
cur = conn.cursor()

#建立數據表
#cur.execute("create table student(id int ,name varchar(20),class varchar(30),age varchar(10))")

#插入一條數據
#cur.execute("insert into student values('2','Tom','3 year 2 class','9')")


#修改查詢條件的數據
#cur.execute("update student set class='3 year 1 class' where name = 'Tom'")

#刪除查詢條件的數據
#cur.execute("delete from student where age='9'")

cur.close()
conn.commit()
conn.close()

 

獲取元素的html內容

# 這是一個select元素
a = driver.find_element_by_id("model_tb_car_personal_current_sheng")

# 獲取元素的html代碼 print(a.get_attribute(
'innerHTML'))

# 很奇怪的,竟然經過這個能夠獲取到option的數量 print(a.get_attribute(
'length'))
相關文章
相關標籤/搜索