selenium使用

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結合
相關文章
相關標籤/搜索