本篇介紹一下python+selenium複雜操做的處理,基於python3.6,selenium3.141,詳細資料介紹查看官方API文檔,點擊這裏html
1、常見特殊狀況處理如iframe/彈窗處理python
有時候定位不到元素,是由於須要定位的元素在frame裏面,這個時候須要切換到對應的frame裏面,再去定位元素git
1 # 切換frame 2 driver.switch_to.frame("frame") # 切入到id="frame"的嵌套中 3 driver.switch_to.default_content() # 退出當前frame, 退回到原來的主body 4 driver.switch_to.parent_frame() # 返回上一級父frame 5 # 彈窗對話框處理 6 driver.switch_to.alert.text # 獲取網頁上的警告信息 7 driver.switch_to.alert.accept # 接受警告信息,告警彈窗對話框點擊肯定 8 driver.switch_to.alert.dismiss # 取消告警彈窗對話框 9 driver.switch_to.alert.send_keys("context") # 彈窗對話框中輸入context 10 # 切換窗口/瀏覽器 11 driver.window_handles # 獲取全部瀏覽器句柄,通常用於for in 遍歷 12 driver.switch_to.window("handle") # 切換到handle的窗口
2、等待時間的設置github
隱形等待,設置全局元素等待超時時間。隱性等待是指當要查找元素,而這個元素沒有立刻出現時,告訴WebDriver 查詢Dom必定時間。默認值是0, 可是設置以後,這個時間將在WebDriver 對象實例整個生命週期都起做用。但這裏有一個弊端,那就是程序會在設定的時間內一直等待整個頁面加載完成,纔會執行下一步,有時候個別JS加載比較慢會比較浪費時間。web
1 # 設置隱性等待時間 2 driver.implicitly_wait(10)
顯性等待,wait模塊的WebDriverWait()類,配合until或者until_not方法,再輔以一些判斷條件expected_conditions模塊,就能夠構成這樣一個場景:每通過多少秒就查看一次locator的元素是否可見,若是可見就中止等待,若是不可見就繼續等待直到超過規定的時間後,報超時異常;若是同時設置隱性等待和顯性等待,取最大等待時間。api
1 # 設置顯性等待 2 from selenium.webdriver.support import expected_conditions as EC 3 """ 4 __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None) 5 - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote) 6 - timeout - 超時時間 7 - poll_frequency - 迭代間隔時間,停幾秒從新獲取一次,默認0.5S 8 - ignored_exceptions - 超時時間內忽略的異常,默認只有NoSuchElementException 9 """ 10 WebDriverWait(driver, 20, 1).until(EC.presence_of_element_located((By.ID, 'foo')))
expected_conditions模塊經常使用的判斷條件,這裏根據官方API翻譯一下,僅供參考瀏覽器
3、Cookie處理cookie
1 driver.get_cookies() # 得到全部cookie信息 2 driver.get_cookie("name") # 返回指定name的cookie信息 3 driver.add_cookie({'name': 'key', 'value': 'value'}) # 添加cookie 4 driver.delete_cookie("name") # 刪除指定name的cookie 5 driver.delete_all_cookies() # 刪除全部cookie
4、其餘操做(下拉框/文件上傳等)ui
1 # 下拉框處理 2 from selenium.webdriver.support.ui import Select 3 # when given "foo" this would select an option like: <option value="foo">Bar</option> 4 Select(driver.find_element_by_xpath('xpath')).select_by_value("foo") 5 # 上傳文件,使用send_keys()發送一個本地的文件路徑,從而達到上傳文件的目的 6 driver.find_element_by_name("file").send_keys('D:\\test_file.xlsx') 7 # 截圖,必須以".png"結尾 8 driver.get_screenshot_as_file("text.png")