爬蟲系列---selenium詳解


一 安裝

pip install Selenium

 

二 安裝驅動

chrome驅動文件:點擊下載chromedriver (yueyu下載)

 

三 配置chromedrive的路徑(僅添加環境變量即可)

  我的電腦–>屬性–>系統設置–>高級–>環境變量–>系統變量–>Path,將“F:\GeckoDriver”目錄添加到Path的值中。比如:Path字段;F:\GeckoDriver

 

四 selenium定位操作

  • find_element_by_id() #通過id查找獲取
  • find_element_by_name() #通過name屬性查找
  • find_element_by_class_name() #通過class屬性查找
  • find_element_by_tag_name() #通過標簽名字查抄
  • find_element_by_link_text() #通過瀏覽器中可點擊的文本查找
  • find_element_by_xpath() #通過xpath表達式查找
  • find_element_by_css_selector() #通過css選擇器查找

 

driver=webdriver.Chrome() #實例化一個瀏覽器

driver.get('https://www.baidu.com') #瀏覽器訪問百度

input_tag=driver.find_element_by_id('kw') #獲取輸入框

input_tag.send_keys('趙麗穎')#輸入框中輸入‘趙麗穎

driver.find_element_by_id('su').click() #找到’百度一下‘按鈕,並點擊,開始搜索

driver.find_element_by_link_text('知道').click() #點擊頁面上的 ’知道‘

 

find_element_by_id('kw'):

 

find_element_by_link_text('知道')

 

 

五 瀏覽器控制相關操作函數

  • 設置瀏覽器窗口大小:driver.set_window_size(480, 800) 
  • 回退到上一個訪問頁面:driver.back()
  • 前進到下一個訪問頁面:driver.forward()
#設置瀏覽器顯示窗口大小
driver.set_window_size(480,800)

driver.get('https://www.zhihu.com') #訪問知乎

driver.back() #回退到上一個訪問頁面

driver.forward() #前進到下一個訪問過的頁面

drive.quit() #退出瀏覽器

 

六 webdriver常用的方法

  • 點擊和輸入
  • click() 點擊
  • send_keys(value) 輸入值
  • clear() 清空輸入
driver=webdriver.Chrome() #實例化一個瀏覽器

driver.get('https://www.baidu.com') #瀏覽器訪問百度

input_tag.send_keys('趙麗穎')#輸入框中輸入‘趙麗穎

driver.find_element_by_id('kw').clear() #清空輸入框

driver.find_element_by_id('kw').send_keys('周傑倫') #輸入查詢 ’周傑倫‘

driver.find_element_by_id("su").click() #點擊百度一下
  • size 元素對應的大小
  • text  獲取對應元素的文字
# 屬性 size和文本
driver.get('http://www.baidu.com')
driver.find_element_by_id('kw').size #獲取搜索的元素的尺寸{'height': 22, 'width': 395}
driver.find_element_by_id("cp").text #獲取指定標簽的文本值

driver.quit()

 

七 鼠標事件/ActionChains(動作鏈)

在 WebDriver 中, 將這些關於鼠標操作的方法封裝在 ActionChains 類提供。

  • perform():執行所有ActionChains中存儲的所有行為
  • context_click():右擊
  • double_click():雙擊
  • drag_and_drop():拖動
  • move_to_element():懸浮
  • click_and_hold():鼠標按住不松手
  • move_to_lelment():拖動到某元素
  • move_by_offset(xoffset=50,yoffset=60):按坐標移動

執行流程

  • 1 定位到響應元素
  • 2 ActionChains(實例化的瀏覽器).鼠標操作(帶操作的元素).perform() 使用(什么瀏覽器),用什么鼠標操作功能,操作(什么元素),perform()提交給瀏覽器執行響應的行為
#引入 ActionChains類
from selenium.webdriver.common.action_chains import ActionChains

driver=webdriver.Chrome()
driver.get("https://www.baidu.cn")

#鼠標定位到需要懸浮的元素
above=driver.find_element_by_link_text('設置')
ditu=driver.find_element_by_link_text('地圖')

#對定位的元素執行鼠標操作
ActionChains(driver).move_to_element(above).perform()
ActionChains(driver).double_click(above).perform() #鼠標右擊

driver.quit() #退出

 

拖拽滑塊移動小實例

from selenium import webdriver
from selenium.webdriver import ActionChains #導入動作鏈
import time
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
#必須轉內部網頁(html套html格式),否則拿不到數據
browser.switch_to.frame('iframeResult') 

#獲取被拖動的物體,和拖動到的目標元素
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')

#實例動作鏈對象
actions = ActionChains(browser) 

#執行一系列動作
# actions.drag_and_drop(source, target)
actions.click_and_hold(source).perform() #鼠標選取並按住元素source,不松手
time.sleep(1)
actions.move_to_element(target).perform() #拖動元素到target的位置
time.sleep(1)
actions.move_by_offset(xoffset=50,yoffset=0).perform() #在目標位置進行偏移拖動

actions.release() #釋放動作鏈
 
        

 

八 鍵盤事件

  • 1 引入Keys 模塊: from selenium.webdriver.common.keys import Keys
  • 2 通過send_keys()發送信息
  • 3 組合形式 Keys.BACK_SPACE 刪除鍵
     Keys.SPACE 空格鍵 Keys.F1 鍵盤F1鍵 Keys.CONTROL,'a' 全選 contrl表示contrl鍵
#引入Keys模塊
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.get('https://www.baidu.com')

#輸入一個內容
input=driver.find_element_by_id('kw')
input.send_keys('seleniumGG')

#刪除多余的GG
input.send_keys(Keys.BACKSPACE)
input.send_keys(Keys.BACKSPACE)

#繼續輸入
input.send_keys('教程')

#全選輸入框的內容,一次性刪除
input.send_keys(Keys.CONTROL,'a')
input.send_keys(Keys.BACKSPACE)

#輸入周傑倫,通過回車鍵來代替點擊'百度一下'
input.send_keys('周傑倫')
input.send_keys(Keys.ENTER)

driver.quit()

 

九  斷言信息

掌握三個屬性

  • title:用於獲得當前頁面的標題。
  • current_url:用戶獲得當前頁面的URL。
  • text:獲取搜索條目的文本信息。
  • tag_name:獲取標簽名
  • get_attribute('id') :獲取id的屬性值
#調用方式
driver.title  #返回當前頁面的標題

driver.current_url #返回當前頁面的url

user = driver.find_element_by_class_name('nums').text #獲取某元素的文本信息

 

十 定位一組元素

  • find_elements_by_id()
  • find_elements_by_name()
  • find_elements_by_class_name()
  • find_elements_by_tag_name()
  • find_elements_by_link_text()
  • find_elements_by_partial_link_text()
  • find_elements_by_xpath()
  • find_elements_by_css_selector()

a_list=driver.find_elements_by_xpath('//div[@id="u1"]/a')

#獲取圖片中的a標簽文本信息

from time import sleep

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

a_list=driver.find_elements_by_xpath('//div[@id="u1"]/a')

for a in a_list:
    print(a.text)

driver.quit()

 

十一 多表單切換(人人網登錄)

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.renren.com/")

#輸入賬戶密碼
driver.find_element_by_id('email').send_keys('1837081**31(賬號)') #換成自己的賬號
driver.find_element_by_id('password').send_keys('QWERT***IO(密碼)') #換成自己的密碼

#點擊登錄
driver.find_element_by_id('login').click()

driver.quit()

 

十二 多窗口切換

  • driver.switch_to_window(某窗口)
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

#獲取百度搜索窗口句柄
search_windows=driver.current_window_handle

driver.find_element_by_link_text('登錄').click()
driver.find_element_by_link_text('立即注冊').click()

#獲取當前窗口句柄
register_windows=driver.current_window_handle

driver.switch_to_window(search_windows) #瀏覽器跳轉記錄的窗口

 

十三 警告框的處理 (****)

  • 1 獲取警告框 dialog=driver.switch_to_alert
  • 2 dialog.accept() 或者 dialog.send_keys(1) text:返回 alert/confirm/prompt 中的文字信息。
  • 基本方法
    •   accept():接受現有警告框。
    •   dismiss():解散現有警告框。
    •   send_keys(keysToSend):發送文本至警告框。keysToSend:將文本發送至警告框。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠標懸停至“設置”鏈接
link = driver.find_element_by_link_text('設置')
ActionChains(driver).move_to_element(link).perform()

# 打開搜索設置
driver.find_element_by_link_text("搜索設置").click()

# 保存設置
driver.find_element_by_class_name("prefpanelgo").click()
time.sleep(2)

#獲取警告框對象
dialog=driver.switch_to_alert()

dialog.text #獲取警告框的內容

dialog.accept() #接受結果,確認

driver.quit()

 

十四 下拉框選擇

#核心代碼
from selenium.webdriver.support.select import Select

#搜索結果顯示條數設置
sel=driver.find_element_by_xpath('//*[@id="nr"]')
Select(sel).select_by_value('10')

 

#第一步導包
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep

#驅動網頁
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')


# 鼠標懸停至“設置”鏈接
driver.find_element_by_link_text('設置').click()
sleep(1)
# 打開搜索設置
driver.find_element_by_link_text("搜索設置").click()
sleep(2)

#搜索結果顯示條數設置
sel=driver.find_element_by_xpath('//*[@id="nr"]')
Select(sel).select_by_value('10')

#保存並關閉
driver.find_element_by_class_name('prefpanelgo').click()

#處理警告框
#1 獲取警告框對象
dialog=driver.switch_to_alert()
#2 打印文本值
print(dialog.text) #已經記錄下您的使用偏好
#3 接受
dialog.accept()

driver.quit()

 

十五 文件上傳

  • 定位上傳按鈕,添加本地文件 -driver.find_element_by_name("file").send_keys('D:\upload_file.txt')

 

十六 cookie操作

  • get_cookies(): 獲得所有cookie信息。
  • get_cookie(name): 返回字典的key為“name”的cookie信息。
  • add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典對象,必須有name 和value 值。
  • delete_cookie(name,optionsString):刪除cookie信息。“name”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域”。
  • delete_all_cookies(): 刪除所有cookie信息。

實際使用

cookie= driver.get_cookies() #獲取cookie
driver.add_cookie({'name': 'key-aaaaaaa', 'value': 'value-bbbbbb'}) #添加cookie

 

十七 調用JavaScript代碼

  • window.scrollTo(0,450); #滑動條往下滑動450

  • 執行方式 js="window.scrollTo(100,450);"

                    driver.execute_script(js)

js='window.scrollTo(0,document.body.scrollHeight)' #下滑到底部
driver.execute_script(js)

 

十八 窗口截圖

  • 截取當前窗口,並指定截圖圖片的保存位置
    - driver.get_screenshot_as_file("D:\baidu_img.jpg")

 

十九 關閉瀏覽器

  • close() 關閉單個窗口

  • quit() 關閉所有窗口

 

二十 顯示等待與隱式等待

  在Selenium中,get()方法會在網頁框架加載結束后結束執行,此時如果獲取page_source,可能並不是瀏覽器完全加載完成的頁面,如果某些頁面有額外的Ajax請求,我們在網頁源代碼中也不一定能成功獲取到。所以,這里需要延時等待一定時間,確保節點已經加載出來。這里等待的方式有兩種:一種是隱式等待,一種是顯式等待。

  • 隱式等待:

    當使用隱式等待執行測試的時候,如果Selenium沒有在DOM中找到節點,將繼續等待,超出設定時間后,則拋出找不到節點的異常。

 

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素

browser=webdriver.Chrome()

#隱式等待:在查找所有元素時,如果尚未被加載,則等10秒
browser.implicitly_wait(10)

browser.get('https://www.baidu.com')
input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)

contents=browser.find_element_by_id('content_left') #沒有等待環節而直接查找,找不到則會報錯
print(contents)

browser.close()

 

  • 顯示等待

    隱式等待的效果其實並沒有那么好,因為我們只規定了一個固定時間,而頁面的加載時間會受到網絡條件的影響。這里還有一種更合適的顯式等待方法,它指定要查找的節點,然后指定一個最長等待時間。如果在規定時間內加載出來了這個節點,就返回查找的節點;如果到了規定時間依然沒有加載出該節點,則拋出超時異常。

 

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待頁面加載某些元素

browser=webdriver.Chrome()
browser.get('https://www.baidu.com')


input_tag=browser.find_element_by_id('kw')
input_tag.send_keys('美女')
input_tag.send_keys(Keys.ENTER)


#顯式等待:顯式地等待某個元素被加載
wait=WebDriverWait(browser,10)
wait.until(EC.presence_of_element_located((By.ID,'content_left')))

contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
print(contents)


browser.close()

 

二十一 cookies操作

使用Selenium,還可以方便地對Cookies進行操作,例如獲取、添加、刪除Cookies等。示例如下:

from selenium import webdriver
 
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) #添加cookie
print(browser.get_cookies()) #獲取cookies
browser.delete_all_cookies() #刪除所有的cookies
print(browser.get_cookies()) #獲取cookies

 

二十二 異常處理

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

#三個異常:超時,沒有這個元素,使用switch_to_frame出現的沒有這個子html錯誤
try:
    browser=webdriver.Chrome()
    browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
    browser.switch_to.frame('iframssseResult')

except TimeoutException as e:
    print(e)
except NoSuchFrameException as e:
    print(e)
finally:
    browser.close()

 

 

 二十三 獲取網頁源碼(****)

  •  driver.page_source 

 

#互動到頁面底部js
window.scrollTo(0,document.body.scrollHeight)

 

二十四  phantotomJs

  無界面驅動瀏覽器執行爬蟲程序

'''
    selenium:基於瀏覽器自動化操作的模塊.可以通過代碼制定一些瀏覽器自動化的行為動作,然后將該行為動作作用到瀏覽器中
    1.pip install selenium
    2.導包:from selenium import webdriver
    3.下載瀏覽器的驅動程序
        下載地址:http://chromedriver.storage.googleapis.com/index.html
        版本的映射關系表:https://blog.csdn.net/huilan_same/article/details/51896672
    4.實例化一個瀏覽器對象(驅動程序)
    5.通過代碼指定行為動作
'''

'''
    什么是phantomJs:無界面的瀏覽器
'''
from selenium import webdriver
from time import sleep
bro = webdriver.PhantomJS(executable_path='./phantomjs-2.1.1-windows/bin/phantomjs.exe')
sleep(2)
bro.get(url='https://www.baidu.com/')
sleep(3)
text_input = bro.find_element_by_id('kw')
text_input.send_keys('周傑倫')
sleep(2)
btn = bro.find_element_by_id('su')
btn.click()
sleep(3)

#瀏覽器執行js代碼
js = 'window.scrollTo(0,document.body.scrollHeight)'
bro.execute_script(js)
sleep(3)
#截屏
bro.save_screenshot('./ppppppp.png')
#獲取當前瀏覽器顯示的頁面數據
page_text = bro.page_source #頁面數據也包含動態加載出來的數據
print(page_text)

bro.quit()

 

實例

  • selenium+phantomjs 就是爬蟲終極解決方案

有些網站上的內容信息是通過動態加載js形成的,所以使用普通爬蟲程序無法回去動態加載的js內容。例如豆瓣電影中的電影信息是通過下拉操作動態加載更多的電影信息。

from selenium import webdriver
from time import sleep
import time

if __name__ == '__main__':
    url = 'https://movie.douban.com/typerank?type_name=%E6%81%90%E6%80%96&type=20&interval_id=100:90&action='
    # 發起請求前,可以讓url表示的頁面動態加載出更多的數據
    path = r'C:\Users\Administrator\Desktop\爬蟲授課\day05\ziliao\phantomjs-2.1.1-windows\bin\phantomjs.exe'
    # 創建無界面的瀏覽器對象
    bro = webdriver.PhantomJS(path)
    # 發起url請求
    bro.get(url)
    time.sleep(3)
    # 截圖
    bro.save_screenshot('1.png')

    # 執行js代碼(讓滾動條向下偏移n個像素(作用:動態加載了更多的電影信息))
    js = 'window.scrollTo(0,document.body.scrollHeight)'
    bro.execute_script(js)  # 該函數可以執行一組字符串形式的js代碼
    time.sleep(2)

    bro.execute_script(js)  # 該函數可以執行一組字符串形式的js代碼
    time.sleep(2)
    bro.save_screenshot('2.png') 
    time.sleep(2) 
    # 使用爬蟲程序爬去當前url中的內容 
    html_source = bro.page_source # 該屬性可以獲取當前瀏覽器的當前頁的源碼(html) 
    with open('./source.html', 'w', encoding='utf-8') as fp: 
        fp.write(html_source) 
    bro.quit()

注意:不能直接打開爬取出來的html文件,文件中存在js語句,阻止本地打開,渲染數據。

 

  • 破解滑動驗證碼

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait # 等待元素加載的
from selenium.webdriver.common.action_chains import ActionChains  #拖拽
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By
from PIL import Image
import requests
import re
import random
from io import BytesIO
import time


def merge_image(image_file,location_list):
    """
     拼接圖片
    """
    im = Image.open(image_file)
    im.save('code.jpg')
    new_im = Image.new('RGB',(260,116))
    # 把無序的圖片 切成52張小圖片
    im_list_upper = []
    im_list_down = []
    # print(location_list)
    for location in location_list:
        # print(location['y'])
        if location['y'] == -58: # 上半邊
            im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,116)))
        if location['y'] == 0:  # 下半邊
            im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))

    x_offset = 0
    for im in im_list_upper:
        new_im.paste(im,(x_offset,0))  # 把小圖片放到 新的空白圖片上
        x_offset += im.size[0]

    x_offset = 0
    for im in im_list_down:
        new_im.paste(im,(x_offset,58))
        x_offset += im.size[0]
    #new_im.show()
    return new_im

def get_image(driver,div_path):
    '''
    下載無序的圖片  然后進行拼接 獲得完整的圖片
    :param driver:
    :param div_path:
    :return:
    '''
    background_images = driver.find_elements_by_xpath(div_path)
    location_list = []
    for background_image in background_images:
        location = {}
        result = re.findall('background-image: url\("(.*?)"\); background-position: (.*?)px (.*?)px;',background_image.get_attribute('style'))
        # print(result)
        location['x'] = int(result[0][1])
        location['y'] = int(result[0][2])

        image_url = result[0][0]
        location_list.append(location)
    image_url = image_url.replace('webp','jpg')
    # '替換url http://static.geetest.com/pictures/gt/579066de6/579066de6.webp'
    image_result = requests.get(image_url).content
    image_file = BytesIO(image_result) # 是一張無序的圖片
    image = merge_image(image_file,location_list)

    return image


def get_track(distance):

    # 初速度
    v=0
    # 單位時間為0.2s來統計軌跡,軌跡即0.2內的位移
    t=0.2
    # 位移/軌跡列表,列表內的一個元素代表0.2s的位移
    tracks=[]
    tracks_back=[]
    # 當前的位移
    current=0
    # 到達mid值開始減速
    mid=distance * 7/8
    print("distance",distance)
    global random_int
    random_int=8
    distance += random_int # 先滑過一點,最后再反着滑動回來

    while current < distance:
        if current < mid:
            # 加速度越小,單位時間的位移越小,模擬的軌跡就越多越詳細
            a = random.randint(2,5)  # 加速運動
        else:
            a = -random.randint(2,5) # 減速運動
        # 初速度
        v0 = v
        # 0.2秒時間內的位移
        s = v0*t+0.5*a*(t**2)
        # 當前的位置
        current += s
        # 添加到軌跡列表
        if round(s)>0:
            tracks.append(round(s))
        else:
            tracks_back.append(round(s))


        # 速度已經達到v,該速度作為下次的初速度
        v= v0+a*t

        print("tracks:",tracks)
        print("tracks_back:",tracks_back)
        print("current:",current)

    # 反着滑動到大概准確位置

    tracks_back.append(distance-current)
    tracks_back.extend([-2,-5,-8,])

    return tracks,tracks_back


def get_distance(image1,image2):
    '''
       拿到滑動驗證碼需要移動的距離
      :param image1:沒有缺口的圖片對象
      :param image2:帶缺口的圖片對象
      :return:需要移動的距離
      '''
    # print('size', image1.size)

    threshold = 50
    for i in range(0,image1.size[0]):  # 260
        for j in range(0,image1.size[1]):  # 160
            pixel1 = image1.getpixel((i,j))
            pixel2 = image2.getpixel((i,j))
            res_R = abs(pixel1[0]-pixel2[0]) # 計算RGB差
            res_G = abs(pixel1[1] - pixel2[1])  # 計算RGB差
            res_B = abs(pixel1[2] - pixel2[2])  # 計算RGB差
            if res_R > threshold and res_G > threshold and res_B > threshold:
                return i  # 需要移動的距離


def main_check_code(driver,element):
    """
    拖動識別驗證碼
    :param driver:
    :param element:
    :return:
    """

    login_btn = driver.find_element_by_class_name('js-login')
    login_btn.click()

    element = WebDriverWait(driver, 30, 0.5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'gt_guide_tip')))
    slide_btn = driver.find_element_by_class_name('gt_guide_tip')
    slide_btn.click()



    image1 = get_image(driver, '//div[@class="gt_cut_bg gt_show"]/div')
    image2 = get_image(driver, '//div[@class="gt_cut_fullbg gt_show"]/div')
    # 圖片上 缺口的位置的x坐標

    # 2 對比兩張圖片的所有RBG像素點,得到不一樣像素點的x值,即要移動的距離
    l = get_distance(image1, image2)
    print('l=',l)

    # 3 獲得移動軌跡
    track_list = get_track(l)
    print('第一步,點擊滑動按鈕')
    element = WebDriverWait(driver, 30, 0.5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'gt_slider_knob')))
    ActionChains(driver).click_and_hold(on_element=element).perform()  # 點擊鼠標左鍵,按住不放
    import time
    time.sleep(0.4)
    print('第二步,拖動元素')
    for track in track_list[0]:
         ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()  # 鼠標移動到距離當前位置(x,y)
    #time.sleep(0.4)
    for track in track_list[1]:
          ActionChains(driver).move_by_offset(xoffset=track, yoffset=0).perform()  # 鼠標移動到距離當前位置(x,y)
          time.sleep(0.1)
    import time
    time.sleep(0.6)
    # ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()  # 鼠標移動到距離當前位置(x,y)
    # ActionChains(driver).move_by_offset(xoffset=8, yoffset=0).perform()  # 鼠標移動到距離當前位置(x,y)
    # ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()  # 鼠標移動到距離當前位置(x,y)
    print('第三步,釋放鼠標')
    ActionChains(driver).release(on_element=element).perform()
    time.sleep(1)

def main_check_slider(driver):
    """
    檢查滑動按鈕是否加載
    :param driver:
    :return:
    """
    while True:
        try :
            driver.get('https://www.huxiu.com/')
            element = WebDriverWait(driver, 30, 0.5).until(EC.element_to_be_clickable((By.CLASS_NAME, 'js-login')))
            if element:
                return element
        except TimeoutException as e:
            print('超時錯誤,繼續')
            time.sleep(5)

if __name__ == '__main__':

    try:
        count = 3  # 最多識別3次
        driver = webdriver.Chrome()
        while count > 0:
            # 等待滑動按鈕加載完成
            element = main_check_slider(driver)
            main_check_code(driver,element)
            try:
                success_element = (By.CSS_SELECTOR, '.gt_success')
                # 得到成功標志
                success_images = WebDriverWait(driver,3).until(EC.presence_of_element_located(success_element))
                if success_images:
                    print('成功識別!!!!!!')
                    count = 0
                    import sys
                    sys.exit()
            except Exception as e:
                print('識別錯誤,繼續')
                count -= 1
                time.sleep(1)
        else:
            print('too many attempt check code ')
            exit('退出程序')
    finally:
        driver.close()

 

本文推薦

****slenium官網:http://www.selenium.org.cn/1598.html

快速入門:http://www.testclass.net/selenium_python/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM