1. 程式人生 > >Python學習--Selenium模塊學習(2)

Python學習--Selenium模塊學習(2)

driver cond 屬性 ted cat aid browser ng- links

Selenium的基本操作

獲取瀏覽器驅動尋找方式

1. 通過手動指定瀏覽器驅動路徑
2. 通過 `$PATH`環境變量找尋瀏覽器驅動

可參考Python學習--Selenium模塊簡單介紹(1)

控制瀏覽器訪問URL

browser.get(https://www.baidu.com/) 
 

find系列函數定位元素

- `find_element_by_xxx`   返回第一個符合條件 `WebElement`
- `find_elements_by_xxx`  返回符合條件所有元素包含了`WebEelemnt`列表
- `find`函數系列說明
  - `find_element_by_class_name`    通過class 查詢元素
  - `find_element_by_id`            通過 ID
  - `find_element_by_name`          通過name
  - `find_element_by_tag_name`      通過標簽名稱
  - `find_element_by_css_selector`  css樣式選擇
  - `find_element_by_link_text`     通過鏈接內容查找
  - `find_element_by_partial_link_text` 通過鏈接內容包含的內容查找,模糊查詢
  - `find_element_by_xpath`         通過 xpath 查找數據

獲取元素屬性和文本內容

# 獲取屬性
element.get_attribute(‘屬性名‘)
# 獲取文本內容
element.text

輸入框輸入內容

input_element.send_keys(‘博客園‘)

自動百度查找博客園

import time

# 1. 導入模塊
from selenium import webdriver

# 2. 創建瀏覽器對象,
browser = webdriver.Chrome() # 參數驅動路徑,默認參數也是當前路徑的chromedriver驅動

# 3. 輸入網址
browser.get("https://www.baidu.com/")

timeout = 60
start_time = time.time()
while True:
try:
time.sleep(0.1) # 兼顧其他程序使用CPU資源
# 4. 找到輸入框,輸入關鍵詞
input_element = browser.find_element_by_id(‘kw‘)
input_element.send_keys("小a玖拾柒-博客園") # 查詢博客園
# 5. 找到“百度一下”的按鈕,點擊一下按鈕
button = browser.find_element_by_id(‘su‘)
button.click()
time.sleep(3) # 讓網頁加載完成
# 6. 找到作者的博客園鏈接
url_element = browser.find_element_by_link_text("小a玖拾柒 - 博客園")
url_element.click()
break
except Exception as e:
if time.time() > start_time: # 超時
print(e)
break

# 退出瀏覽器
time.sleep(3)
browser.quit()

查看百度首頁的鏈接(獲取元素是文本內容和元素屬性)

import time
# 1. 導入模塊
from selenium import webdriver

# 2. 創建瀏覽器對象,
browser = webdriver.Chrome()  # 參數驅動路徑,默認參數也是當前路徑的chromedriver驅動

# 3. 輸入網址
browser.get("https://www.baidu.com/")

baidu_list = browser.find_elements_by_class_name("mnav")
for item in baidu_list:
    # 獲取元素是文本內容和元素屬性
    print("{0}:{1}".format(item.text, item.get_attribute("href")))

# 退出瀏覽器
time.sleep(5)
browser.quit()

技術分享圖片

擴展:Selenium的自動等待方式

當控制瀏覽器時,瀏覽器正在加載頁面同時又去獲取數據導致瀏覽器尋找不到需要操作的元素引發異常。
- 方式一:強制等待,浪費時間

import time
time.sleep(秒數)

- 方式二:隱性等待,缺點:無法控制 AJAX請求

browser.implicitly_wait(等待時間)

- 方式三:顯性等待,每個元素都可以自己定義檢查條件

手動編寫:

timeout = 60
start_time = time.time()
while True:
    try:
        time.sleep(0.1)  # 兼顧其他程序使用CPU資源
        # 4. 找到輸入框,輸入關鍵詞
        input_element = browser.find_element_by_id(‘kw‘)
        input_element.send_keys("小a玖拾柒-博客園")  # 查詢博客園
        # 5. 找到“百度一下”的按鈕,點擊一下按鈕
        button = browser.find_element_by_id(‘su‘)
        button.click()
        time.sleep(3)  # 讓網頁加載完成
        # 6. 找到作者的博客園鏈接
        url_element = browser.find_element_by_link_text("小a玖拾柒 - 博客園")
        url_element.click()
        break
    except Exception as e:
        if time.time() > start_time:   # 超時
            print(e)
            break

Selenium提供:

# 導入顯性等待的API需要的模塊
    # 1> 等待對象模塊
    from selenium.webdriver.support.wait import WebDriverWait
    # 2> 導入等待條件模塊
    from selenium.webdriver.support import expected_conditions as EC
    # 3> 導入查詢元素模塊
    from selenium.webdriver.common.by import By

    # 使用selenium api 實現顯性等待
    # 1> 創建等待對象
    # 參數一 瀏覽器對象
    # 參數二 超時時間
    # 參數三 檢查元素時間間隔
    wait = WebDriverWait(browser,60,0.1)
    # presence_of_element_located 檢查元素是否存在,參數是一個元祖,元祖內部描述等待元素查詢方案
    # visibility_of_element_located 檢查元素是否可見
    url_element= wait.until(EC.presence_of_element_located((By.CLASS_NAME,"favurl")))
    url_element.click()

Python學習--Selenium模塊學習(2)