2022-03-31

selenium工作原理

image.png

selenium原理.png

原理:webdriver是按照server–client的經(jīng)典設(shè)計(jì)模式設(shè)計(jì)的颤介。

server端就是remote server纵隔,可以是任意的瀏覽器虑灰。當(dāng)我們的腳本啟動(dòng)瀏覽器后正卧,該瀏覽器就是remote server叹坦,它的職責(zé)就是等待client發(fā)送請(qǐng)求并做出相應(yīng)检碗;client端簡(jiǎn)單說來就是我們的測(cè)試代碼挖息,我們測(cè)試代碼中的一些行為金拒,比如打開瀏覽器,轉(zhuǎn)跳到特定的url等操作是以http請(qǐng)求的方式發(fā)送給被測(cè)試瀏覽器套腹,也就是remote server绪抛;remote server接受請(qǐng)求,并執(zhí)行相應(yīng)操作电禀,并在response中返回執(zhí)行狀態(tài)幢码、返回值等信息。

4. selenium環(huán)境搭建

1)python3.7

2)Firefox35(大于43)

3)selenium2框架

穩(wěn)定版 2.48.0 (pip install selenium==2.48.0)

4)瀏覽器驅(qū)動(dòng)

下載谷歌驅(qū)動(dòng)

selenium之 chromedriver與chrome版本映射表

Firefox瀏覽器對(duì)應(yīng)各個(gè)版本驅(qū)動(dòng)下載地址

firefox各個(gè)版本安裝包的下載地址

注意:Firefox35(大于43)版本不需要下載驅(qū)動(dòng)器尖飞,大于這個(gè)版本的需要症副,Chrome需要下載驅(qū)動(dòng)器,下邊分別演示政基。

5. selenium對(duì)瀏覽器操作

1)庫的導(dǎo)入

fromseleniumimportwebdriver

2)創(chuàng)建瀏覽器對(duì)象

driver = webdriver.xxx()

使用dir(driver)查看方法

# 必須為大寫driver = webdriver.Firefox()driver = webdriver.Chrome()

3)瀏覽器尺寸相關(guān)操作

maximize_window()? ? 最大化get_window_size()? ? 獲取瀏覽器尺寸贞铣,打印查看set_window_size()? ? 設(shè)置瀏覽器尺寸,400*400

4)瀏覽器位置相關(guān)操作

get_window_position()? ? 獲取瀏覽器位置set_window_position(x,y)? ? 設(shè)置瀏覽器位置

注意:顯示器以左上角為(0,0),所有的位置操作都是相對(duì)于顯示器左上角展開的位移操作沮明,單位是像素辕坝。

5)瀏覽器的關(guān)閉操作

close()關(guān)閉當(dāng)前標(biāo)簽/窗口quit()關(guān)閉所有標(biāo)簽/窗口

6)頁面請(qǐng)求操作

driver.get(url)請(qǐng)求某個(gè)url對(duì)應(yīng)的響應(yīng)refresh()刷新頁面操作back()回退到之前的頁面forward()前進(jìn)到之后的頁面

案例

fromselenium import webdriverimport time# driver = webdriver.Chrome()#不可以找到,必須導(dǎo)入對(duì)應(yīng)的驅(qū)動(dòng)器driver=webdriver.Firefox()url1="http://www.baidu.com"url2="https://zhuanlan.zhihu.com/"# 請(qǐng)求第一個(gè)接口driver.get(url1)time.sleep(3)# 刷新driver.refresh()driver.get(url2)# 回退driver.back()time.sleep(3)# 前進(jìn)driver.forward()time.sleep(3)driver.close()

6. selenium獲取斷言信息

6.1 什么是斷言

斷言是編程術(shù)語荐健,表示為一些布爾表達(dá)式酱畅,程序員相信在程序中的某個(gè)特定點(diǎn)該表達(dá)式值為真琳袄,可以在任何時(shí)候啟用和禁用斷言驗(yàn)證,因此可以在測(cè)試時(shí)啟用斷言而在部署時(shí)禁用斷言圣贸。

6.2 獲取斷言信息的操作

current_url? ? 獲取當(dāng)前訪問頁面url

title? ? ? 獲取當(dāng)前瀏覽器標(biāo)題

page_source? ? ? 獲取網(wǎng)頁源碼

print(driver.current_url)print(driver.title)print(driver.page_source)

get_screenshot_as_png()? ? 保存圖片

data=driver.get_screenshot_as_png()withopen("a.png","wb")asf:f.write(data)

image.png

get_screenshot_as_file(file)? ? 直接保存

driver.get_screenshot_as_file("b.png")

7. selenium八大元素定位

from selenium import webdriverdriver=webdriver.Firefox()# url = "http://www.baidu.com"# driver.get(url)# 第一種 id# ele = driver.find_element_by_id("kw")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# from selenium.webdriver.common.by import By# ele = driver.find_element(By.ID,"kw")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# 第二種 標(biāo)簽名字# ele = driver.find_element_by_name("wd")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# 第三種 class# ele = driver.find_element_by_class_name("s_ipt")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# 第四種 Xpath# ele = driver.find_element_by_xpath("http://*[@id='kw']")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# 第五種 css class# ele = driver.find_element_by_css_selector("#kw")# ele.send_keys(12306)? # 輸入數(shù)據(jù)# 第六種 text# ele = driver.find_element_by_link_text("地圖")# ele.click()? # 輸入數(shù)據(jù)# 第七種:類似于模糊匹配# ele = driver.find_element_by_partial_link_text("地")# ele.click()# 第八種:標(biāo)簽名定位挚歧,必須得保證只有一個(gè)這種名字的標(biāo)簽扛稽,使用下面這個(gè)搜索# url = "http://cn.bing.com/"# driver.get(url)# ele = driver.find_element_by_tag_name("input")# ele.send_keys(12306)? # 輸入數(shù)據(jù)

8. 元素的操作

對(duì)元素的相關(guān)操作吁峻,一般要先獲取到元素,再調(diào)用相關(guān)方法

element = driver.find_element_by_xxx(value)

1)點(diǎn)擊和輸入

點(diǎn)擊操作---------->element.click()

清空/輸入操作:

element.clear()---------------------->清空輸入框

element.send_keys(data)-------->輸入數(shù)據(jù)

案例

1.打開百度搜索? ? ? ? 2.搜索關(guān)鍵字 selenium? ? ? ? 3.清空? ? ? ? ? ? 4.搜索python

2)提交操作

element.submit()

9. 多標(biāo)簽之間的切換

場(chǎng)景:有的時(shí)候點(diǎn)擊一個(gè)鏈接在张,新頁面并非由當(dāng)前頁面跳轉(zhuǎn)過去用含,而是新開一個(gè)頁面打開,這種情況下帮匾,計(jì)算機(jī)需要識(shí)別多標(biāo)簽或窗口的情況啄骇。

1)獲取所有窗口的句柄

handles = driver.window_handlers

調(diào)用該方法會(huì)得到一個(gè)列表,在selenium運(yùn)行過程中的每一個(gè)窗口都有一個(gè)對(duì)應(yīng)的值存放在里面瘟斜。

2)通過窗口的句柄進(jìn)入的窗口

driver.switch_to_window(handles[n])

driver.switch_to.window(handles[n])

通過窗口句柄激活進(jìn)入某一窗口

案例:58同城租房信息:http://bj.58.com

driver.get("http://bj.58.com")ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()# 直接報(bào)錯(cuò)缸夹,原因是需要句柄eleDaxing=driver.find_element_by_link_text("大興")eleDaxing.click()# 使用句柄driver.get("http://bj.58.com")print("點(diǎn)擊之前句柄:",driver.window_handles)ele=driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")ele.click()list_windowns=driver.window_handlesprint("點(diǎn)擊之后句柄:",driver.window_handles)driver.switch_to.window(list_windowns[1])eleDaxing=driver.find_element_by_link_text("大興")eleDaxing.click()

10. 多表單切換

在網(wǎng)頁中,表單嵌套是很常見的情況螺句,尤其是在登錄的場(chǎng)景

10.1 什么是多表單

實(shí)際上就是使用iframe/frame虽惭,引用了其他頁面的鏈接,真正的頁面數(shù)據(jù)并沒有出現(xiàn)在當(dāng)前源碼中蛇尚,但是在瀏覽器中我們看到芽唇,簡(jiǎn)單理解可以使頁面中開了一個(gè)窗口顯示另一個(gè)頁面

10.2 處理方法

直接使用id值切換進(jìn)表單

driver.switch_to.frame(value)/driver.switch_to_frame(value)

定位到表單元素,再切換進(jìn)入

el = driver.find_element_by_xxx(value)

driver.switch_to.frame(el)/driver.switch_to_frame(el)

案例:QQ空間:https://qzone.qq.com/

fromselenium import? webdriver#打開游覽器driver=webdriver.Firefox()#登錄QQurl="https://qzone.qq.com/"driver.get(url)#獲取元素#定位表單元素ele_bd=driver.find_element_by_id("login_frame")driver.switch_to.frame(ele_bd)ele=driver.find_element_by_xpath(".//*[@id='switcher_plogin']")ele.click()#輸入賬號(hào)ele2=driver.find_element_by_id("u")ele2.send_keys()#輸入密碼ele3=driver.find_element_by_id("p")ele3.send_keys("")ele4=driver.find_element_by_id("login_button")ele4.click()

11. 彈出框操作

進(jìn)入到彈出框中

driver.switch_to.alert

接收警告

accept()

解散警告

dismiss()

發(fā)送文本到警告框

send_keys(data)

用法:driver.switch_to.alert.accept()

案例:

from seleniumimportwebdriverdriver=webdriver.Firefox()driver.get("http://www.baidu.com")ele_setting=driver.find_element_by_id("s-usersetting-top")ele_setting.click()ele_gaoji=driver.find_element_by_class_name("setpref")ele_gaoji.click()ele_save=driver.find_element_by_class_name("prefpanelgo")ele_save.click()driver.switch_to.alert.accept()

12.下拉框

fromseleniumimportwebdriverimporttimedriver=webdriver.Firefox()driver.get("http://www.baidu.com")ele=driver.find_element_by_id("s-usersetting-top")ele.click()ele1=driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")ele1.click()time.sleep(2)ele2=driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")ele2.click()list_ele=driver.find_elements_by_class_name("c-select-item")print(list_ele)list_ele[2].click()# for list_i in list_ele:#? ? print(list_i.text)#? ? if list_i.text =="最近一周":#? ? ? ? list_i.click()

13. 鼠標(biāo)和鍵盤操作

手動(dòng)測(cè)試時(shí)鍵盤的操作在selenium頁有實(shí)現(xiàn)取劫,關(guān)于鼠標(biāo)的操作由ActionChains()類來提供匆笤,關(guān)于鍵盤的操作由Key()類來提供

1)鼠標(biāo)操作

導(dǎo)入動(dòng)作鏈類,動(dòng)作鏈可以儲(chǔ)存鼠標(biāo)的動(dòng)作谱邪,并一起執(zhí)行

fromselenium.webdriverimportActionChainsActionChains(driver)

鼠標(biāo)右擊

el=driver.find_element_by_xxx(value)context_click(el)

對(duì)el執(zhí)行右擊

執(zhí)行ActionChains中儲(chǔ)存的所有動(dòng)作

perform()

常用鼠標(biāo)動(dòng)作:

ActionChains(driver).context_click(ele).perform()點(diǎn)擊鼠標(biāo)右鍵ActionChains(driver). double_click(ele).perform()點(diǎn)擊鼠標(biāo)左鍵ActionChains(driver).move_to_element(el).perform()鼠標(biāo)懸停

案例

from selenium.webdriverimportActionChainsfrom seleniumimportwebdriverimporttimedriver=webdriver.Firefox()driver.get("http://www.baidu.com")ele=driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")# ele.click()ActionChains(driver).double_click(ele).perform()

2)鍵盤操作

鍵盤操作使用的是Keys類,一般配合send_keys使用

導(dǎo)入

from selenium.webdriver.common.keys import Keys

常用鍵盤操作

send_keys(Keys.BACK_SPACE)刪除鍵(BackSpace)send_keys(Keys.SPACE)空格鍵(Space)send_keys(Keys.TAB)制表鍵(Tab)send_keys(Keys.ESCAPE)回退鍵(Esc)send_keys(Keys.ENTER)回車鍵(Enter)send_keys(Keys.CONTROL,‘a(chǎn)’)全選(Ctrl+A)send_keys(Keys.CONTROL,‘a(chǎn)’)全選(Ctrl+A)send_keys(Keys.CONTROL,‘x’)剪切(Ctrl+X)send_keys(Keys.CONTROL,‘v’)粘貼(Ctrl+V)send_keys(Keys.F1)鍵盤 F1send_keys(Keys.F12)鍵盤 F12

14. 瀏覽器等待

1) 為什么要進(jìn)行等待炮捧?

1.網(wǎng)速慢

2.網(wǎng)站內(nèi)容過多

3.如果不進(jìn)行等待而直接定位元素,可能會(huì)拋出異常

2) selenium中等待的分類:

顯示等待

顯示等待是根據(jù)條件進(jìn)行等待惦银,等待條件出現(xiàn)

實(shí)現(xiàn):

fromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasECWebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

WebDriverWait類是由WebDirver 提供的等待方法寓盗。在設(shè)置時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測(cè)一次當(dāng)前頁面元素是否存在璧函,如果超過設(shè)置時(shí)間檢測(cè)不到則拋出異常傀蚌。

案例

WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located((By.CLASS_NAME,"g-hu")))

思考:顯示等待與time的區(qū)別?

隱式等待

隱式等待是根據(jù)是件進(jìn)行等待,等待特定時(shí)間

driver.implicitly_wait(n)

n的單位為秒,n為最大值蘸吓,在這個(gè)最大值內(nèi)只要該界面上的全部元素都加載完成定就結(jié)束沒有加載出元素就拋出? NosuchException.

注意:優(yōu)先隱式等待善炫,次之顯式等待,最次固定等待

15. 練習(xí)

使用游覽器登錄http://www.baidu.com

搜索淘寶官網(wǎng)

登錄用戶名和密碼

搜索商品(手機(jī)库继,電腦箩艺,窜醉,,艺谆,),給定約束條件(價(jià)格,包郵,發(fā)貨地址榨惰。。静汤。)

將商品添加到購物車

在購物中游覽該商品

根據(jù)自己的喜好進(jìn)行下面的操作

16. 2.IDE功能簡(jiǎn)介

image.png

文件:創(chuàng)建琅催、打開和保存測(cè)試案例和測(cè)試案例集。編輯:復(fù)制虫给、粘貼藤抡、刪除、撤銷和選擇測(cè)試案例中的所有命令抹估。Options : 用于設(shè)置seleniunm IDE缠黍。

用來填寫被測(cè)網(wǎng)站的地址。

速度控制:控制案例的運(yùn)行速度药蜻。

運(yùn)行所有:運(yùn)行一個(gè)測(cè)試案例集中的所有案例瓷式。

運(yùn)行:運(yùn)行當(dāng)前選定的測(cè)試案例。

暫停/恢復(fù):暫停和恢復(fù)測(cè)試案例執(zhí)行语泽。

單步:可以運(yùn)行一個(gè)案例中的一行命令贸典。

錄制:點(diǎn)擊之后,開始記錄你對(duì)瀏覽器的操作湿弦。

案例集列表瓤漏。

測(cè)試腳本;table標(biāo)簽:用表格形式展現(xiàn)命令及參數(shù)颊埃。source標(biāo)簽:用原始方式展現(xiàn)蔬充,默認(rèn)是HTML語言格式,也可以用其他語言展示班利。

查看腳本運(yùn)行通過/失敗的個(gè)數(shù)饥漫。

當(dāng)選中前命令對(duì)應(yīng)參數(shù)。

日志/參考/UI元素/Rollup

# -*- coding: utf-8 -*-fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.support.uiimportSelectfromselenium.common.exceptionsimportNoSuchElementExceptionfromselenium.common.exceptionsimportNoAlertPresentExceptionimportunittest,time,reclassQq(unittest.TestCase):defsetUp(self):self.driver=webdriver.Firefox()self.driver.implicitly_wait(30)self.base_url="https://qzone.qq.com/"self.verificationErrors=[]self.accept_next_alert=Truedeftest_qq(self):driver=self.driver? ? ? ? driver.get(self.base_url+"/")# ERROR: Caught exception [ERROR: Unsupported command [selectFrame | login_frame;login_href=https%3A%2F%2Fxui.ptlogin2.qq.com%2Fcgi-bin%2Fxlogin%3Fproxy_url%3Dhttps%253A%2F%2Fqzs.qq.com%2Fqzone%2Fv6%2Fportal%2Fproxy.html%26daid%3D5%26%26hide_title_bar%3D1%26low_login%3D0%26qlogin_auto_login%3D1%26no_verifyimg%3D1%26link_target%3Dblank%26appid%3D549000912%26style%3D22%26target%3Dself%26s_url%3Dhttps%253A%252F%252Fqzs.qq.com%252Fqzone%252Fv5%252Floginsucc.html%253Fpara%253Dizone%26pt_qr_app%3D%25E6%2589%258B%25E6%259C%25BAQQ%25E7%25A9%25BA%25E9%2597%25B4%26pt_qr_link%3Dhttps%253A%2F%2Fz.qzone.com%2Fdownload.html%26self_regurl%3Dhttps%253A%2F%2Fqzs.qq.com%2Fqzone%2Fv6%2Freg%2Findex.html%26pt_qr_help_link%3Dhttps%253A%2F%2Fz.qzone.com%2Fdownload.html%26pt_no_auth%3D0 | ]]driver.switch_to.frame(driver.find_element_by_id("login_frame"))driver.find_element_by_id("switcher_plogin").click()# driver.find_element_by_id("uin_del").click()driver.find_element_by_id("u").clear()driver.find_element_by_id("u").send_keys("3084761668")driver.find_element_by_id("p").clear()driver.find_element_by_id("p").send_keys("dafei123457")driver.find_element_by_id("login_button").click()# ERROR: Caught exception [ERROR: Unsupported command [selectWindow | null | ]]# driver.find_element_by_id("tcaptcha_drag_thumb").click()# self.assertEqual(driver.title,"QQ空間")self.assertIn("QQ11空間",driver.title)defis_element_present(self,how,what):try:self.driver.find_element(by=how,value=what)exceptNoSuchElementExceptionase:returnFalsereturnTruedefis_alert_present(self):try:self.driver.switch_to_alert()exceptNoAlertPresentExceptionase:returnFalsereturnTruedefclose_alert_and_get_its_text(self):try:alert=self.driver.switch_to_alert()alert_text=alert.textifself.accept_next_alert:alert.accept()else:alert.dismiss()returnalert_textfinally:self.accept_next_alert=TruedeftearDown(self):self.driver.quit()self.assertEqual([],self.verificationErrors)if__name__=="__main__":unittest.main()

百度罗标、QQ空間

導(dǎo)出

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庸队,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子闯割,更是在濱河造成了極大的恐慌彻消,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙拉,死亡現(xiàn)場(chǎng)離奇詭異宾尚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門煌贴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來御板,“玉大人,你說我怎么就攤上這事牛郑〉±撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵淹朋,是天一觀的道長笙各。 經(jīng)常有香客問我,道長瑞你,這世上最難降的妖魔是什么酪惭? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任希痴,我火速辦了婚禮者甲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘砌创。我一直安慰自己虏缸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布嫩实。 她就那樣靜靜地躺著刽辙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甲献。 梳的紋絲不亂的頭發(fā)上宰缤,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音晃洒,去河邊找鬼慨灭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛球及,可吹牛的內(nèi)容都是我干的氧骤。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼吃引,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筹陵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镊尺,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤朦佩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庐氮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體语稠,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年旭愧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颅筋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宙暇。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖议泵,靈堂內(nèi)的尸體忽然破棺而出占贫,到底是詐尸還是另有隱情,我是刑警寧澤先口,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布型奥,位于F島的核電站,受9級(jí)特大地震影響碉京,放射性物質(zhì)發(fā)生泄漏厢汹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一谐宙、第九天 我趴在偏房一處隱蔽的房頂上張望定血。 院中可真熱鬧,春花似錦愈魏、人聲如沸筹淫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兑巾。三九已至,卻和暖如春忠荞,著一層夾襖步出監(jiān)牢的瞬間蒋歌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工委煤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堂油,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓素标,卻偏偏與公主長得像称诗,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子头遭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1.什么是xpath寓免? XPath即為XML路徑語言,它是一種用來(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)在 HTML\XML ...
    fymjackson閱讀 522評(píng)論 0 0
  • 十八單元 自動(dòng)化持續(xù)繼承 1.概念 1.持續(xù)集成:持續(xù)的將分支集成到主干 2.持續(xù)交付:持續(xù)將此版本提交給質(zhì)量團(tuán)隊(duì)...
    小董小董閱讀 410評(píng)論 0 0
  • 一计维、什么是框架 1.框架 框架(framework)是一個(gè)框子 -- 指其約束性袜香,也是一個(gè)架子 -- 指其支撐性,...
    藝術(shù)家123閱讀 188評(píng)論 0 0
  • 一鲫惶、概念 互聯(lián)網(wǎng)軟件的開發(fā)和發(fā)布蜈首,已經(jīng)形成了一套標(biāo)準(zhǔn)流程,最重要的組成部分就是持續(xù)集成(Continuous in...
    __65a0閱讀 792評(píng)論 0 4
  • 參考鏈接: web自動(dòng)化測(cè)試教案:http://www.cnblogs.com/zidonghua/p/74300...
    永杰gg閱讀 1,048評(píng)論 0 0