selenium使用:一、導入selenium模塊二、啓動瀏覽器driver=webdriver.chrome() driver.get('www.baidu.com')三、頁面刷新driver.refresh()四、頁面後退前進,driver.back(),driver.forward()五、設置窗口大小,driver,set_window_size(540,960)六、將瀏覽器窗口最大化,driver.maximize_window()七、截屏保存,driver.get_screenshot_as_file("D:\\test\\1.png")八、關閉,driver.close()或driver.quit(),close是關閉當前窗口,quit是結束關閉全部窗口,回收臨時文件九、火狐瀏覽器使用(使用火狐的插件Firebug和firepath) 一、安裝插件Firebug和firepath,直接在附加組件中搜索安裝便可 二、元素定位,點擊瀏覽器上方小爬蟲便可使用 三、經過firepath選擇css和xpath 四、火狐瀏覽器輔助定位終極大插件:SeleniumBuilder 直接在附加組件中搜索安裝便可 使用:工具->web開發者->Launch Selenium->Builder->輸入要測url點擊record十、selenium定位,webdriver提供18種元素定位 一、經常使用的8中元素定位(元素定位需html基礎) 1.find_element_by_id() 2.find_element_by_name() 3.find_element_by_class_name() 4.find_element_by_tag_name() 5.find_element_by_link_text(hao123) 超連接可以使用 6.find_element_by_partial_link_text(o123) 超連接很長,模糊匹配方式 7.find_element_by_xpath() 沒有id,name,class,也不是超連接,可用xpath 用工具Firebug和firepath快速查看,也能夠自寫 8.find_element_by_css_selector() css是另外一種語法,比xpath簡潔,也可用firepath查看 二、8種複數形式定位 1.find_elements_by_id(self, id_) 2.find_elements_by_name(self, name) 3.find_elements_by_class_name(self, name) 4.find_elements_by_tag_name(self, name) 5.find_elements_by_link_text(self, text) 6.find_elements_by_partial_link_text(self, link_text) 7.find_elements_by_xpath(self, xpath) 8.find_elements_by_css_selector(self, css_selector) 三、2種參數化方法 1.find_element(self, by='id', value=None) 2.find_elements(self, by='id', value=None)十一、xpath語法詳解 一、工具查看比較死板,不夠靈活,可本身手動的去寫 二、XPath即爲XML路徑語言,經過元素的路徑來查找 三、xapth屬性定位 1.xptah也能夠經過元素的id、name、class這些屬性定位,如 //*[@id='kw'] 2.若是id、name、class屬性都沒有,能夠經過其它屬性定位 如 //*[@autocomplete='off'] 四、xpath標籤 1.同1屬性,同名多,可經過標籤篩選(直接寫標籤名稱),定位更準 如 //input[@id='kw'] 2.不想制定標籤名稱,用*號表示任意標籤 五、xpath層級 1.若是自己找不到,可找祖宗找後代,來定位 2.一層一層找,經過層級關係定位 六、xpath索引 1.1個元素它的兄弟元素跟它的標籤同樣,這時候沒法經過層級定位到。由於都是一個父親生的,多胞胎兄弟 2.多胞胎很難識別,但出生有前後,可經過它在家裏的排行老幾定位,可用索引 如//*[@id='nr']/option[1] 七、xpath邏輯運算 (and,or,not),and是使用主流 如 //*[@id='kw' and @autocomplete='off'] 八、xpath模糊匹配 基本沒有定位不到的,模糊匹配某個屬性,匹配以什麼開頭,以什麼結尾,如 //*[starts-with(@id,'kw')] 九、xpath支持強大的正則表達式 如 //*[matchs(text(),'hao13')]xpath是元素定位界的屠龍刀。武林至尊,寶刀xpath,css不出,誰與爭鋒?十二、css語法詳解(對比xpath) 一、css中通常屬性樣式如name:[name='wd'] 二、css用可用#表示id的屬性 如 :#kw ,可用.表示class屬性 如: .s_ipt,標籤無任何標識符 三、css定位,標籤可與id和class屬性組合使用 如:input#kw input.s_ipt 四、標籤與其餘屬性組合定位 如: input[id='kw'],同xpath中標籤篩選類似 五、css層級關係 一、用xpath://form[@id='form']/span/input和//form[@class='fm']/span/input 二、用css:form#kw>span>input 和 form.fm>sapan>input 六、css的索引方式 select#nr>option:nth_child(1) 七、css的邏輯運算無需寫and,如:input[id='kw'][autocomplete='off']1三、操做元素 1.點擊(鼠標左擊)頁面按鈕:click() 2.清空輸入框:clear() 3.輸入字符串:send_keys() 4.submit()通常用於模擬回車鍵,提交表單 五、模擬鍵盤操做,先導入鍵盤模塊:from selenium.webdriver.common.keys import Keys 模擬enter鍵,能夠用send_keys(Keys.ENTER) 複製Ctrl+C:send_keys(Keys.CONTROL,'c') 粘貼Ctrl+V:send_keys(Keys.CONTROL,'v') 全選Ctrl+A:send_keys(Keys.CONTROL,'a') 剪切Ctrl+X:send_keys(Keys.CONTROL,'x') 製表鍵Tab: send_keys(Keys.TAB) 六、模擬鼠標,先導入模塊:from selenium.webdriver.common.action_chains import ActionChains 用法:mouse = driver.find_element_by_link_text("設置") ActionChains(driver).move_to_element(mouse).perform() perform() 執行全部ActionChains中的行爲 move_to_element() 鼠標懸停 右擊鼠標:context_click() 雙擊鼠標:double_click()1四、多窗口、句柄(handle) 一、獲取當前窗口句柄: h=driver.current_window_handle 並打印 二、獲取當前全部的句柄:all_h=driver.current_window_handles 三、切換句柄 方法一、 for i in all_h: if i !=h: driver.switch_to.window(i) print driver.title 方法二、 driver.switch_to.window(all_h[1]) print driver.title 四、close是關閉當前窗口,由於此時有兩個窗口,用close能夠關閉其中一個,quit是退出整個進程1五、frame與iframe區別與切換 一、iframe是整個區域,不能點擊其中屬性 二、需切換到frame才能操做 三、切換方法switch_to_frame ,frame默認支持id和name,如:driver.switch_to.frame('id、name屬性') 四、若是iframe沒有id和name,可先切換到tag上也能達到效果 五、釋放iframe,driver.switch_to.default_content() 六、判斷元素是否在iframe上,切換到firepath界面,顯示Top window沒有在,顯示iframe#id則在1六、select下拉框,二次定位 一、select下拉框中元素,一次定位不到,需進行二次定位 二、如:driver.find_element_by_id("nr").find_element_by_xpath("//option[@value='50']").click() 三、可分開寫 s=driver.find_element_by_id("nr") 先定位到下拉框 s.find_element_by_xpath("//option[@value='50']").click() 四、直接定位,用xpath或css一步到位 如xpath:driver.find_element_by_xpath(".//select[@id='nr']/option[2]") driver.find_element_by_css_selector(".//select#nr>option:nth_child(2)")1七、select模塊(index)(value)(text) 一、selenium還提供了更高級的玩法,導入Select模塊。直接根據屬性或索引定位 二、導入select方法:from selenium.webdriver.support.select import Select 三、經過select選項的索引來定位選擇對應選項(從0開始計數) s=driver.find_element_by_id("nr") Select(s).select_by_index(2) 四、經過select選項的value值來定位 Select(s).select_by_value("20") 五、經過select選項的文本內容定位text Select(s).select_by_visible_text("每頁顯示20條") 六、select模塊的其餘方法 elect_by_index() :經過索引定位 select_by_value() :經過value值定位 select_by_visible_text() :經過文本值定位 deselect_all() :取消全部選項 deselect_by_index() :取消對應index選項 deselect_by_value() :取消對應value選項 deselect_by_visible_text() :取消對應文本選項 first_selected_option() :返回第一個選項 all_selected_options() :返回全部的選項1八、彈框alert\confirm\prompt 一、alert\confirm\prompt彈出框操做主要方法有: .text:獲取文本值 .accept() :點擊"確認" .dismiss() :點擊"取消"或者叉掉對話框 .send_keys() :輸入文本值 --僅限於prompt 二、識別區分alert\confirm\prompt alert只有確認按鈕,但可dismiss,頁面不能輸入 confirm有確認取消按鈕,頁面不能輸入 prompt 可輸入,提交確認與取消 都用switch_to.alert()切換到彈框上 driver.find_element_by_id("confirm").click() t=switch_to.alert() t.text ...1九、單選框和複選框(radiobox、checkbox) 一、單選框,複選框單選直接定位點擊 二、複選框全選,type是同樣的都是checkbox,可經過複數形式獲取到全部的CheckBox對象 三、find_elements不能直接點擊,可經過for循環去所有勾選 四、判斷是否選中 .is_selected()返回bool類型,print()出來,勾選爲true,未勾選false20、table表格定位 一、table頁面查看源碼通常有這幾個明顯的標籤:table、tr、th、td 二、經過xpath定位2一、加載Firefox配置 一、須要用FirefoxProfile(profile_directory)這個類來加載 二、profile_directory既爲瀏覽器配置文件的路徑地址 三、profile_directory=None,若是沒有路徑,默認爲None 四、路徑:打開Firefox點右上角設置>?(幫助)>故障排除信息>顯示文件夾 五、profile_directory= 路徑 六、加載配置 profile = webdriver.Firefoxprofile(profile_directory) 七、啓動瀏覽器 webdriver.Firefox(profile)2二、加載Chrome配置 一、加載Chrome,將username改成電腦名稱:--user-data-dir=C:\Users\Gloria\AppData\Local\Google\Chrome\User Data 二、option = webdriver.ChromeOptions() 三、option.add_argument('--user-data-dir=C:\Users\Gloria\AppData\Local\Google\Chrome\User Data') 四、driver = webdriver.Chrome(chrome_options=option) 五、wap測試假裝手機訪問 from selenium import webdriver option = webdriver.ChromeOptions() # 假裝iphone登陸 # option.add_argument('--user-agent=iphone') # 假裝android option.add_argument('--user-agent=android') driver = webdriver.Chrome(chrome_options=option) driver.get('http://www.taobao.com/') app = driver.page_source #獲取源碼 print(app)2一、富文本(richtext)富文本編輯 --2二、非input文件上傳(SendKeys) 一、pip install SendKeys)---2三、獲取元素屬性 一、獲取頁面title,直接driver.title,print(tile) 二、獲取元素的文本 driver.find_element_by_id().text 三、獲取元素的標籤 .tag_name 四、獲取元素的其餘屬性 .get_attribute() 五、獲取瀏覽器名稱 driver.name2四、爬頁面源碼(page_source) 一、driver.page_source直接返回源碼 二、從新賦值後打印出來 三、導入正則模塊 re.findall(),返回的是一個集合 四、可再建一個集合,把集合中篩選的添加到另外一個集合25 cookie相關操做 一、獲取cookie,driver.get_cookies() 二、登陸先後cookie有變化 三、獲取指定name的cookie driver.get_cookie(name='') 四、清除cookie, delete_cookie() 五、清除全部的cookie, delete_all_cookies() 六、添加cookie,driver.add_cookie(cookie_dict)2六、繞過驗證碼(add_cookie) 一、fiddler抓包抓取cookie 二、添加cookie,將cookie的全部參數用字典列出來,如: c1 ={'':''} driver.add_cookie(c1) driver.refresh() 刷新頁面便可2七、js處理滾動條 一、當屏幕上下或左右有拉昇,需用滾動條 二、selenium提供了一操做js的方法:execute_script() 三、滾動條回到頂部 js="var q=document.getElementById('id').scrollTop=0" driver.execute_script(js) 四、滾動條拉到底部 js="var q=document.documentElement.scrollTop=10000" driver.execute_script(js) 五、可修改scrollTop的值,來定位右側滾動條的位置,0是最上面,10000是最底部 六、左右控制scrollTo(x, y),js = "window.scrollTo(100,400);" 七、谷歌可用:js = "var q=document.body.scrollTop=0" 八、元素聚焦target = driver.find_element_by_xxxx() driver.execute_script("arguments[0].scrollIntoView();", target)2八、js處理日曆控件 ---2.2329 js處理內嵌div滾動條---2.2430、js定位 一、id定位 document.getElementById(「xxx」) driver.execute_script(js) 二、name定位 document.getElementsByName(「Name」) 三、標籤選取元素定位 四、document.getElementsByTagName(「tag」) 五、document.getElementsByClassName(「class」) 六、document.querySelectorAll(「css selector")3一、jQuery定位 一、按f12進入控制檯 二、點擊 "所有"按鈕 三、輸入定位語法,如$("#input1"),點擊運行便可 四、基礎語法$(selector).action(), 五、selector:這裏的定位語法和css的定位語法是一致的 六、.action()是定位後的操做行爲如click3二、jquery行爲 一、發送文本語法:$(selector).val(輸入文本的值) 二、清空文本語法:$(selector).val('') # 空字符串,兩個單引號 三、點擊按鈕:$(selector).click()3三、unittest 一、加載unittest,繼承unittest類--- 二、前置後置及unittest執行順序 三、unittest斷言 1.assertEqual(self, first, second, msg=None) --判斷兩個參數相等:first == second 2.assertNotEqual(self, first, second, msg=None) --判斷兩個參數不相等:first != second 3.assertIn(self, member, container, msg=None) --判斷是字符串是否包含:member in container 4.assertNotIn(self, member, container, msg=None) --判斷是字符串是否不包含:member not in container 5.assertTrue(self, expr, msg=None) --判斷是否爲真:expr is True 6.assertFalse(self, expr, msg=None) --判斷是否爲假:expr is False 7.assertIsNone(self, obj, msg=None) --判斷是否爲None:obj is None 8.assertIsNotNone(self, obj, msg=None) --判斷是否不爲None:obj is not None 四、unittest批量執行 一、用discover加載測試用例 二、case_path = os.path.join(os.getcwd(), "case") 用例路徑 三、定義一個all_case函數 四、discover =unittest.defaltTestLoader.discover(case_path, pattern="test*.py", top_level_dir=None) 五、unittest.TestSuite().addTests(discover) #直接加載discover 六、unittest.TextTestRunner().run(all_case()) 五、unittest裝飾器(@classmethod)參數cls, 解決瀏覽器屢次打開問題 一、 @classmethod def setUpClass(cls): cls.driver..... 六、測試報告生成HTMLTestRunner 一、在批量執行的基礎上,導入HTMLTestRunner 二、報告路徑 report_abspath = os.path.join(report_path, "result.html") 三、fp = open(report_abspath, "wb") 保存 四、runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u'自動化測試報告,測試結果以下:', description=u'用例執行狀況:') 五、fp.close() 七、報告中文亂碼問題,HTMLTestRunner.py文件中將uo = o.decode('xxx') xxx替換成utf-8 八、郵件發送(smtp) 一、先導入郵件模塊 import smtplib 二、導入MIMEText庫用來作純文本的郵件模板 from email.mime.text import MIMEText 三、郵件腳本import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipart# -----------一、發件相關的參數---------------smtpserver = "smtp.163.com" # 發件服務器port = 0 # 端口sender = "m18581893850@163.com" # 發件人psw = "wp639889832" # 密碼receiver = "639889832@qq.com" # 收件人# receiver = ["639889836@qq.com", "635889845@qq.com"] # 羣發用列表# -----------二、編輯郵件內容---------------# -----------二、1只發送郵件---------------subject1 = "主題163"body = '<p>發送163郵件</p>' # 郵件正文用html格式msg = MIMEText(body, "html", "utf-8")msg['from'] = sendermsg['to'] = receivermsg['subject'] = subject1# -----------二、2發送附件-------------------# 讀文件subject2 = "發送附件"file_path = "E:\\app_demo\\report\\report.html"with open(file_path, "rb") as fp: mail_body = fp.read()msg = MIMEMultipart()msg["from"] = sender # 發件人msg["to"] = receiver # 收件人# msg["to"] = ";".join(receiver) # 羣發收件人msg["subject"] = subject2 # 主題# 正文body = MIMEText(mail_body, "html", "utf-8")msg.attach(body)# 附件att = MIMEText(mail_body, "base64", "utf-8")att["Content-Type"] = "application/octet-stream"att["Content-Disposition"] = 'attachment; filename="test_report.html"'msg.attach(att)# ----------三、發送郵件---------------------try: smtp = smtplib.SMTP() smtp.connect(smtpserver) # 連服務器 smtp.login(sender, psw)except: smtp = smtplib.SMTP_SSL(smtpserver, port) smtp.login(sender, psw) # 登陸smtp.sendmail(sender, receiver, msg.as_string()) # 發送smtp.quit() # 關閉3四、unittest裝飾器skip 一、@unittest.skip(reason) 無條件跳過,reason說明緣由 二、@unittest.skipIf(condition,reason) condition爲true的時候跳過 三、@unittest.skipUnless(cindition,reason) 爲false時跳過 四、@unittest.expectedFailure 斷言時跳過3五、常見selenium異常 1.NoSuchElementException:沒有找到元素 2.NoSuchFrameException:沒有找到iframe 3.NoSuchWindowException:沒找到窗口句柄handle 4.NoSuchAttributeException:屬性錯誤 5.NoAlertPresentException:沒找到alert彈出框 6.ElmentNotVisibleException:元素不可見 7.ElementNotSelectableException:元素沒有被選中 8.TimeoutException:查找元素超時3六、捕獲異常 一、程序中查找元素中斷,沒法繼續click,需捕獲異常返回 二、用try...except...捕獲異常。捕獲異常後能夠打印出異常緣由 三、使用selenium的exceptions模塊 from selenium.common.exceptions import NoSuchElentException 四、使用方法 try: element = driver.find_element_by_id("ku") except NoSuchElementException as msg: print u"查找元素異常%s"%msg else: element.click()3七、異常截圖,截圖方法 一、get_screenshot_as_file(self,filename) 1.獲取當前window的截圖,IOError時返回False,截圖成功返回Ture 2.filename參數是保存文件的路徑 如:driver.get_screenshot_as_file('/Screenshots/foo.png') 二、get_screenshot_as_base64(self) 獲取屏幕截圖,以base64編碼格式保存,在html報告中可用 如:driver.get_screenshot_as_base64() 三、get_screenshot_as_png(self) 以二進制數據保存 四、圖片名稱能夠加時間戳 nowTime = time.strftime("%Y%m%d.%H.%M.%S") t=driver.get_screenshot_as_file('%s.jpg' % nowTime) print(u"截圖結果:" %t)3八、場景判斷與封裝 一、顯式等待 WebDriverWait 1.class WebDriverWait(object):driver, timeout, poll_frequency 2.driver:返回瀏覽器的一個實例 3.timeout:超時的總時長 4.poll_frequency:循環去查詢的間隙時間,默認0.5秒 二、元素出現,until() 如:WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw")).send_keys("yoyo") 三、元素消失,until_not()3九、封裝讀取Excel(加載xlrd) 一、打開Excel,參數是文件路徑 如:data = xlrd.open_wordbook('E:\app_demo\excel') 二、獲取文件下的表 1.經過索引獲取 table=data.sheets()[0] 或 table = data.sheet_by_index(0) 2.經過名稱獲取 table = data.sheet_by_name(u'Sheet1') 3.獲取總行數 nrows = table.nrows 4.獲取總列數 ncols = table.ncols 5.獲取第一行值 print table.row_values(0) 6.獲取第一列值 print table.col_values(0) 三、Excel存放數據 1.excel中存放數據,第1行爲標題 2.Excel數據純數字是浮點數,設置單元格爲文本格式 四、封裝讀取方法 1.讀取的數據爲字典的list類型數據,對應key和value值 2.封裝代碼# -------------封裝讀取Excel表數據-------------------import xlrd'''定義一個類'''class ExcelUtil(): def __init__(self, exclepath, sheetName): #exclepath = "E:\\app_demo\excel" #sheetName = "sheet1" self.data = xlrd.open_workbook(exclepath) self.table = self.data.sheet_by_name(sheetName) # 獲取第一列的key值 self.keys = self.table.row_values(0) # 獲取總行數 self.rowNum = self.table.nrows # 獲取總列數 self.colNum = self.table.ncols # 讀取Excel表中值 def dict_data(self): if self.rowNum <= 1: print("無有用數據可取") else: # 建立一個列表將數據放入 r = [] j = 1 for i in range(self.rowNum-1): s = {} # 從第二行取對應values值 values = self.table.row_values(j) for x in range(self.colNum): s[self.keys[x]] = values[x] r.append(s) j += 1 return rif __name__ == "__main__": filePath = "E:\\app_demo\excel\\test.xlsx" sheetName = "Sheet1" data = ExcelUtil(filePath, sheetName) print(data.dict_data())# --------------40、數據驅動ddt 一、pip install ddt 二、數據驅動原理 1.測試數據爲多個字典的list類型 2.測試類前加修飾@ddt.ddt 3.case前加修飾@ddt.data() 4.運行後用例會自動加載成多個個單獨的用例import ddtimport unittest# 測試數據test_data = [{'username': 'wapn1', 'psw': '123456'}, {'username': 'wapn2', 'psw': '123456'}, {'username': 'wapn3', 'psw': '123456'}, {'username': 'wapn4', 'psw': '123456'}]@ddt.ddtclass Test(unittest.TestCase): # @classmethod def setUp(self): print("start") # @classmethod def tearDown(self): print("stop") @ddt.data(*test_data) def test_ddt(self, data): print(data)if __name__=="__main__": unittest.main()4一、判斷元素16種方法expected_conditions,簡稱EC,場景判斷 一、title_is: 判斷當前頁面的title是否徹底等於(==)預期字符串,返回布爾值 二、title_contains : 判斷當前頁面的title是否包含預期字符串,返回布爾值 三、presence_of_element_located : 判斷某個元素是否被加到了dom樹裏,並不表明該元素必定可見 四、visibility_of_element_located : 判斷某個元素是否可見. 可見表明元素非隱藏,而且元素的寬和高都不等於0 五、visibility_of : 跟上面的方法作同樣的事情,只是上面的方法要傳入locator,直接傳定位到的element 六、presence_of_all_elements_located : 判斷是否至少有1個元素存在於dom樹中 七、text_to_be_present_in_element : 判斷某個元素中的text是否 包含 了預期的字符串 八、text_to_be_present_in_element_value : 判斷某個元素中的value屬性是否 包含 了預期的字符串 九、frame_to_be_available_and_switch_to_it : 判斷該frame是否能夠switch進去,若是能夠的話,返回True而且switch進去,不然返回False 十、invisibility_of_element_located : 判斷某個元素中是否不存在於dom樹或不可見 十一、element_to_be_clickable : 判斷某個元素中是否可見而且是enable的,這樣的話才叫clickable 十二、staleness_of : 等某個元素從dom樹中移除,注意,這個方法也是返回True或False 1三、element_to_be_selected : 判斷某個元素是否被選中了,通常用在下拉列表 1四、element_selection_state_to_be : 判斷某個元素的選中狀態是否符合預期 1五、element_located_selection_state_to_be : 跟上面的方法做用同樣,只是上面的方法傳入定位到的element,而這個方法傳入locator 1六、alert_is_present : 判斷頁面上是否存在alert4二、EC模塊加載 一、from selenium.common.exceptions import NoSuchElementException 二、from selenium.common.exceptions import NoSuchFrameException 三、from selenium.common.exceptions import StaleElementReferenceException 四、from selenium.common.exceptions import WebDriverException 五、from selenium.common.exceptions import NoAlertPresentException4三、判斷title方法title_is 一、獲取頁面title的方法能夠直接用driver.title獲取,獲取結果斷言 二、用expected_conditions模塊裏的title_is和title_contains兩種方法判斷 title_is 導入模塊給別名如:EC,from selenium.webdriver.support import expected_conditions as EC 打開頁面後判斷title,返回結果是True或False,title =EC.title_is("xxx")並打印 三、判斷title包含:title_contains,用法同樣4四、判斷文本text_to_be_present_in_element 一、判斷元素中是否存在指定的文本,兩個參數:locator, text 二、__call__裏返回的是布爾值:Ture和False 三、用法:locator = ("name", "tj_trnuomi") text = u"糯米" result = EC.text_to_be_present_in_element(locator, text)(driver) print result4五、判斷value的方法text_to_be_present_in_element_value(object)4六、判斷彈出框,alert_is_presentfrom selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChainsfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver = webdriver.Firefox()url = "https://www.baidu.com"driver.get(url)mouse = WebDriverWait(driver, 10).until(lambda x: x.find_element("link text", "設置"))ActionChains(driver).move_to_element(mouse).perform()WebDriverWait(driver, 10).until(lambda x: x.find_element("link text", "搜索設置")).click()# 選擇設置項s = WebDriverWait(driver, 10).until(lambda x: x.find_element("id", "nr"))Select(s).select_by_visible_text("每頁顯示50條")# 點保存按鈕js = 'document.getElementsByClassName("prefpanelgo")[0].click();'driver.execute_script(js)result = EC.alert_is_present()(driver)if result: print result.text result.accept()else: print "alert 未彈出!"4七、二次封裝(click/sendkeys) 一、定位元素代碼driver.find_element_by_id("kw").send_keys(u"小學文化"),說明停留在小學水平 二、避免一會正常運行,一會又報錯的狀況,定位需與WebDriverWait結合