前幾天看到有老外發微博說selenium不是自動化測試工具,在震驚之余我陷入了沉思,這種說法其實是有道理的,原來這個工具用了這么多年,這個隱藏的秘密我竟然一直沒有發現。
很久很久之前,我在各種國外的測試論壇發現大家都在討論一種新的工具:selenium,先入為主,由於在測試論壇最先產生的大范圍討論和關注,我一直把selenium當作是根正苗紅的測試工具,這么多年來一直沒有對這個觀點產生過一點點的懷疑,哪怕selenium其實很多時候被人用作爬蟲,很多時候被別有用心的人拿來做自動化的工具以獲取不法收入,哪怕很多時候被用來做一些效率提升的工具,我都沒有過一絲絲的動搖,在我心里,selenium就是最硬核的瀏覽器自動化測試工具之一。
直到最近幾天不經意間看到有人說(以下內容來自機翻)
測試工具供應商能否請停止將他們的工具與 Selenium 進行比較! 我厭倦了這個!
Selenium webdriver 是一種自動化工具,而不是用於測試! 當然,與非專業的測試工具相比,你開發的專門用於測試的測試工具看起來當然是很不錯的了。拜托,歇歇吧。
看到上面的這條言論我才突然間意識到,selenium webdriver一直在不停的迭代,盡管速度很慢,但webdriver的各個版本里似乎總缺少點什么。於是有人總在搜索selenium的時候加上關鍵字pytest或者junit,於是我總是喜歡在面試的時候問你們用selenium的時候用的是拿個測試框架,於是專門有人寫文章描述如何在斷言里使用expected_conditions。這些證據都非常肯定的證明了selenium其實並不是專門為自動化測試設計的工具,selenium的核心是自動化工具,測試只是其應用的一部分場景而已,selenium明顯格局更大,路走的更寬,真正掩耳盜鈴的是我,我才是那個永遠不能被叫醒的裝睡的人。
漸漸的我意識到,怪不得我之前在公開課里演示selenium的應用時總是喜歡用selenium做爬蟲的例子,怪不得我之前跟一些同學留的練習里,selenium扮演的角色也只是做效率提升的工作,比如每天簽到之類,其實大部分時間我使用selenium只是把它當作是自動化的工具,測試真的只是我使用selenium的一個特別的場景,在這個場景里,一些工作變得很難,比如斷言;一些情況我需要考慮的更多,比如各種環境和配置問題;一些問題變得很棘手,比如用例的修改速度往往趕不上頁面重構的速度等等;我寫selenium最有成就感,最得心應手,寫着寫着有點像讀爽文的場景往往是
- 對爬取速度沒有要求的爬蟲
- 君子能不動手就不動手的場景,比如每天簽到領金幣
這些場景往往跟測試無關,與興趣有關。
很久之前寫的從知乎爬內容的selenium腳本,那時候firefox driver還是webdriver的自帶驅動。
"""
從zhihu.com獲取每日最熱和每月最熱
"""
from selenium import webdriver
from datetime import date
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class Zhihu:
def __init__(self):
self.daily_url = 'https://www.zhihu.com/explore#daily-hot'
self.monthly_url = 'https://www.zhihu.com/explore#monthly-hot'
def __enter__(self):
self.dr = webdriver.Firefox()
return self
def __exit__(self, p1, p2, p3):
self.dr.quit()
def get_daily_hots(self):
result = []
hots_urls = self.get_daily_hots_urls()
for url in hots_urls:
result.append(self.get_answer(url))
return result
def get_answer(self, url):
self.dr.get(url)
# wrap_div = self.dr.find_element_by_css_selector('.zm-item-answer.zm-item-expanded')
article = {}
article['question'] = self.dr.find_element_by_css_selector('#zh-question-title').text
article['author'] = self.dr.find_element_by_css_selector('.author-link').text
article['answer'] = self.dr.find_element_by_css_selector('.zm-editable-content.clearfix').get_attribute('innerHTML')
return article
def get_monthly_hots(self):
pass
def get_daily_hots_urls(self):
self.dr.get(self.daily_url)
wrap_div = self.dr.find_element_by_class_name('tab-panel')
title_url_elements = wrap_div.find_elements_by_class_name('question_link')
assert len(title_url_elements) == 5
urls = []
for title in title_url_elements:
urls.append(title.get_attribute('href'))
return urls
class ZhihuReporter:
def __init__(self, path):
self.report_path = path
self.f = open(path, 'wb')
def write_header(self):
self.f.write('<html><head><meta charset="utf-8">')
self.f.write('<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css">')
self.f.write('<title>Zhihu Report</title></head>')
def write_body(self):
self.f.write('<body>')
def finish_body(self):
self.f.write('</body>')
def write_article(self, articles):
self.f.write('<h3>知乎%s最熱</h3>' %(date.today().strftime('%Y_%m_%d')))
for article in articles:
self.f.write('<div class="container">')
article_html = '<h3>%s<small>%s</small></h3>' %(article['question'], article['author'])
article_html += article['answer']
self.f.write(article_html)
self.f.write('</div>')
self.f.write('<hr>')
def finish_report(self):
self.finish_body()
self.f.write('</html>')
self.f.close()
def build_article_report(self, articles):
self.write_header()
self.write_body()
self.write_article(articles)
self.finish_report()
if __name__ == '__main__':
with Zhihu() as zhihu:
articles = zhihu.get_daily_hots()
report_name = 'zhihu_%s.html' %(date.today().strftime('%Y_%m_%d'))
reporter = ZhihuReporter(report_name)
reporter.build_article_report(articles)
其實這樣看來,selenium作為自動化測試工具其實是有一定門檻的,比如需要結合測試框架,需要自定義po,需要手動維護一些復雜的等待情況,需要自己實現重試機制,更被說框架,斷言,報告這祖傳的三座大山了,正是因為這些痛點的存在,一些新的測試工具應運而生,這些工具為測試這個精准的場景提供了自己的解決方案,比如內置斷言,自帶測試報告等等,讓自動化測試更容易,更穩定,更專業,也正是因為這些工具補齊了selenium所謂的一些“短板”,工具提開發商們便會不停的把selenium拿出來各種比較,以體現自己的先進性和革命性。不過這種比較是偏頗的,就像是在足球的世界里很多球員的頭球能力都比梅西要強,但在進攻綜合實力上梅西還是獨一檔的存在。這些專業的自動化測試工具就像是錘子或者起子,在某一方面很強,但selenium更像是個工具箱,適用的場景更多元化一些。
如果你問我這些專業的自動化測試工具我是不是不推薦,其實我的答案是否定的。
如果這些工具能讓我們以更小的代價更低的成本來實現自動化測試的工作,我們何樂而不為呢?讓工作變得更有效率,有更多的時間去做一些自己感興趣的事情其實一直都是很多測試同學努力的方向。也許在未來的某一天,我會在工作中使用一些專業的自動化測試工具來幫我低成本實現測試的自動化,然后節省下來的時間寫一些隨性的selenium腳本,實現一些有趣的功能,這也未嘗不是一件令人感到身心愉悅的事情。