seleniumAPI常用操作大全和 API再封裝

ckxllf發表於2021-03-03

  前置知識:

  selenium環境搭建

  CSS選擇器和Xpath選擇器

  以下是常用的selenium API的操作方法,但筆者希望用起來更方便一些,所以封裝了常用的操作,檔案上傳到了附件中附件:API再封裝

  

封裝測試

  物件建立

  # 匯入相關庫

  from selenium import webdriver

  import time

  # 建立一個瀏覽器物件,其他的見環境搭建

  driver = webdriver.Chrome()

  # 檢視所有方法

  print(dir(driver))

  瀏覽器操作

  # 設定全屏

  driver.maximize_window()

  # 設定瀏覽器尺寸

  driver.set_window_size(800,600)

  # 獲取當前瀏覽器尺寸

  size = driver.get_window_size()

  print(size)

  # 設定瀏覽器位置

  driver.set_window_position(0,0)

  # 獲取瀏覽器位置

  position = driver.get_window_position()

  print(position)

  # 關閉當前標籤

  # driver.close()

  # 關閉所有標籤

  # driver.quit()

  頁面操作

  # 請求某個url對應的響應

  url = "

  driver.get(url)

  time.sleep(2)

  driver.get(")

  # 重新整理頁面

  time.sleep(2)

  driver.refresh()

  # 回退上一個頁面

  time.sleep(2)

  driver.back()

  # 前進一個頁面

  time.sleep(2)

  driver.forward()

  斷言assert操作

  driver.get(")

  # 獲取當前訪問頁url

  print(driver.current_url)

  # 獲取當前瀏覽器標題

  print(driver.title)

  # 儲存快照

  driver.get_screenshot_as_file("screeshot01.png") # 方式一

  date = driver.get_screenshot_as_png() # 方式二 type(date) --> bytes

  with open("screenshot02.png","wb") as f:

  f.write(date)

  date64 = driver.get_screenshot_as_base64() # 方式三 type(date64) --> str

  print(type(date64))

  with open("screenshot03.png","w") as f:

  f.write(date64)

  # 檢視網頁原始碼

  sourse = driver.page_source

  with open("CSDN.html","wb") as f:

  f.write(sourse.encode()) # str to bytes

  元素定位的兩種方式

  driver.get(")

  # 直接呼叫(推薦)

  el_search = driver.find_element_by_id("toolbar-search-input") # webelement類例項化物件

  print(dir(el_search)) # 檢視element物件中的方法

  el_search.send_keys("TEST") # 傳值

  el_click = driver.find_element_by_id("toolbar-search-button")

  el_click.click()

  # 使用By型別

  from selenium.webdriver.common.by import By

  ele_search = driver.find_element(By.ID,"toolbar-search-input")

  ele_search.send_keys("TEST")

  ele_click = driver.find_element(By.ID,"toolbar-search-button")

  ele_click.click()

  元素的八種定位方法

  '''

  (以下用第一種定位方式舉例)

  '''

  driver.get(")

  driver.find_element_by_css_selector("#app > div > div > div.main > div.main-login > div.main-select > ul > li:nth-child(2) > a").click() #使用賬號密碼登入

  # id定位

  el_by_id = driver.find_element_by_id("toolbar-search-input")

  el_by_id.send_keys("TestID")

  # name屬性值定位

  el_by_name = driver.find_element_by_name("pwd")

  el_by_name.send_keys("TestName")

  # 偽類名定位

  el_by_className = driver.find_element_by_class_name("user-service-link")

  el_by_className.click()

  # 標籤名定位

  el_by_tagName = driver.find_element_by_tag_name("input")

  el_by_tagName.send_keys("TestTagName")

  # 連結文字定位(注意是文字,不是href;selenium會自動補全相對連結地址)

  el_by_linkText = driver.find_element_by_link_text("首頁")

  el_by_linkText.click()

  # 部分連結文字

  el_by_partialLinkText = driver.find_element_by_partial_link_text("首")

  el_by_partialLinkText.click()

  # xpath路徑表示式(注意單雙引號區分)

  el_by_xpath = driver.find_element_by_xpath('//*[@id="tabTwo"]')

  el_by_xpath.click()

  # css選擇器定位

  el_by_css = driver.find_element_by_css_selector("#app > div > div > div.main > div.main-login > div.main-process-login > div > div.form-group.form-group-link > div > a")

  el_by_css.click()

  定位一組元素

  '''

  find_elements_by_xxx,返回一個列表

  影片熱榜中的第一條記錄的css路徑:#floor-sp_66 > div > div.rank_list.sp_rank_wrap > ul > li:nth-child(1) > div > div > a > h4

  改寫之後獲取所有記錄:#floor-sp_66 > div > div.rank_list.sp_rank_wrap > ul > li > div > div > a > h4

  第一條xpath路徑://*[@id="floor-sp_66"]/div/div[2]/ul/li[1]/div/div/a/h4

  改寫://*[@id="floor-sp_66"]/div/div[2]/ul/li/div/div/a/h4

  其他幾種方法同理

  '''

  driver.get(")

  el_list = driver.find_elements_by_xpath('//*[@id="floor-sp_66"]/div/div[2]/ul/li/div/div/a/h4')

  print(el_list)

  元素的操作

  # # 點選

  # element.click()

  # # 清空和輸入(只能操作可輸入的文字框)

  # element.clear()

  # element.send_keys()

  #

  # # 提交

  # element.submit()

  #

  # # 獲取文字內容

  # element.text

  # # 獲取屬性值

  # element.get_attribute("attrName")

  # # 獲取元素尺寸

  # element.size

  # # 獲取元素是否可見

  # element.is_displayed()

  # 例:獲取影片熱榜中的標題

  for el in el_list:

  print("標題:",el.text)

  多標籤之間的切換

  driver.get(")

  driver.find_element_by_link_text("Python").click()

  driver.find_element_by_link_text("Java").click()

  # 獲取所有視窗的控制程式碼,返回一個列表儲存每一個視窗控制程式碼值

  handles = driver.window_handles

  # 透過視窗的控制程式碼切換

  time.sleep(2)

  driver.switch_to.window(handles[0])

  print(driver.title)

  多表單的切換

  '''

  iframe/frame --> 引用了其他頁面的連結,但真正的頁面資料並不出現在當前頁面原始碼中

  '''

  driver.get(")

  el_frame = driver.find_element_by_tag_name("iframe") # 有反爬措施,id會改變

  print(el_frame)

  # 切換進入表單中

  time.sleep(2)

  driver.switch_to.frame(el_frame) # 方式一:先定位,後切換

  # driver.switch_to.frame("id") # 方式二:也可以直接使用id進行切換(如果有固定id的話)

  el_user = driver.find_element_by_name("email")

  el_user.send_keys("TestUser")

  # 切換進入最外層頁面

  driver.switch_to.default_content()

  # 切換進入上層頁面

  driver.switch_to.parent_frame()

  滑鼠常用操作

  '''

  滑鼠常用操作 ActionChains()類

  '''

  driver.get(")

  from selenium.webdriver import ActionChains

  el_logo = driver.find_element_by_css_selector("#csdn-toolbar > div > div > div.toolbar-container-left > div > a > img")

  # 滑鼠右擊操作,操作前需要將元素定位出來並傳入相應的動作中;如果要執行操作,需要呼叫perform()

  ActionChains(driver).context_click(el_logo).perform()

  # 滑鼠雙擊操作

  ActionChains(driver).double_click(el_logo).perform()

  el_float = driver.find_element_by_css_selector("#floor-sp_66 > div > div.card_list.sp_card_wrap > div.card_list_wrap > div:nth-child(1) > a > div > div.video > div")

  # 滑鼠懸停操作

  time.sleep(2)

  ActionChains(driver).move_to_element(el_float).perform()

  鍵盤常用操作

  '''

  鍵盤常用操作 Keys類配合send_keys使用

  '''

  driver.get(")

  el_search = driver.find_element_by_id("toolbar-search-input")

  el_search.send_keys("selenium")

  from selenium.webdriver.common.keys import Keys

  # 全選

  time.sleep(1)

  el_search.send_keys(Keys.CONTROL,"a")

  # 剪下

  time.sleep(1)

  el_search.send_keys(Keys.CONTROL,"x")

  # 貼上

  time.sleep(1)

  el_search.send_keys("hello "+Keys.CONTROL,"v")

  # 刪除

  el_search.send_keys(Keys.BACKSPACE) # BACK_SPACE = BACKSPACE

  警告框操作

  driver.get(")

  driver.find_element_by_id("s-usersetting-top").click()

  driver.find_element_by_class_name("setpref").click()

  time.sleep(2)

  driver.find_element_by_css_selector("#se-setting-7 > a.prefpanelgo.setting-btn.c-btn.c-btn-primary").click()

  # 進入警告框中

  driver.switch_to.alert()

  # 進入警告框中,並點選接受

  time.sleep(2)

  driver.switch_to.alert.accept()

  # 進入警告框中,並解散警告框

  time.sleep(2)

  driver.switch_to.alert.dismiss()

  # 傳送文字到警告框

  # driver.switch_to.alert.send_keys("data")

  下拉框操作

  '''

  下拉框操作 Select類,需要傳入物件

  '''

  driver.get(")

  time.sleep(3)

  driver.find_element_by_xpath('//*[@id="id_sc"]').click()

  time.sleep(1)

  driver.find_element_by_css_selector("#hbsettings > div > div.hb_title_col").click()

  time.sleep(1)

  driver.find_element_by_css_selector("#hbsettree > a:nth-child(4) > div > div.hb_title_col").click()

  from selenium.webdriver.support.select import Select

  time.sleep(1)

  ele_select = driver.find_element_by_id("rpp")

  # 將定位到的下拉框元素傳入Select類中

  selObj = Select(ele_select)

  # 呼叫相應方法選擇下拉框中的選項

  time.sleep(1)

  selObj.select_by_index("0") # 透過索引選擇,str

  time.sleep(1)

  selObj.select_by_value("10") # 透過value值選擇

  time.sleep(1) 大連婦科醫院哪家好

  selObj.select_by_visible_text("50") # 透過文字選擇

  all = selObj.all_selected_options # 檢視所有已選

  first = selObj.first_selected_option # 檢視第一個已選

  isMu = selObj.is_multiple # 檢視是否多選

  opt = selObj.options # 檢視選項元素列表

  print(all,first,isMu,opt)

  呼叫JS程式碼

  driver.get(")

  # 頁面滾動

  js1 = "window.scrollTo(0,2000)"

  js2 = "var q = document.documentElement.scrollTop = 500"

  driver.execute_script(js1)

  time.sleep(2)

  driver.execute_script(js2)

  # 迴圈下拉滾動

  for i in range(20):

  js = "window.scrollTo(0,%s)" %(i*100)

  driver.execute_script(js)

  time.sleep(0.5)

  瀏覽器等待的三種方式

  '''

  瀏覽器等待

  三種方式:

  1.顯式等待 --> 根據條件進行等待,等待條件出現

  2.隱式等待(推薦) --> 嘗試發現某個元素的時候,如果沒能立刻發現,就等待固定長度的時間

  3.固定等待 --> time.sleep,即使載入完了也要等待,浪費時間

  '''

  driver.get(")

  # 顯式等待

  from selenium.webdriver.common.by import By

  from selenium.webdriver.support.ui import WebDriverWait

  from selenium.webdriver.support import expected_conditions as EC

  WebDriverWait(driver,timeout=10,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"toolbar-search-input"))) # 在設定的時間內,預設每隔一段時間檢測一次當前頁面元素是否存在,如果超過時間檢測不到則丟擲異常

  # 隱式等待

  driver.implicitly_wait(10) # 單位為秒,為最大值;在這個最大值內只要定位到就結束等待,否則報錯

  cookies操作

  driver.get(")

  # 獲取cookies --> 字典dict格式

  cookies = driver.get_cookies()

  print(cookies)

  # 獲取key對應的值

  # driver.get_cookie(keyName)

  # 刪除指定名稱的cookie

  # driver.delete_cookie(name="xx")

  # 刪除所有cookies

  driver.delete_all_cookies()

  # 設定cookies

  cookie = {'domain': '.csdn.net', 'expiry': 1645971310, 'httpOnly': False, 'name': 'Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac', 'path': '/', 'secure': False, 'value': '6525*1*10_18797500640-1614435306890-873769'}

  driver.add_cookie(cookie)

  print(driver.get_cookies())

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2760924/,如需轉載,請註明出處,否則將追究法律責任。

相關文章