1. 程式人生 > >一文學會使用selenium, 並實現登入掛英語網站不掉線

一文學會使用selenium, 並實現登入掛英語網站不掉線

本文用於快速入門或者複習selenium的webdriver但不講解如何安裝selenium以及ChromeDriver

先教一些簡單功能,各函式功能在註釋裡

from selenium import webdriver
import time

#訪問百度首頁
first_url = 'http://www.baidu.com'
print("正在訪問%s" % (first_url))
driver.get(first_url)

#列印網頁原始碼
print(driver.page_source)

#訪問新聞頁面
second_url = 'http://news.baidu.com'
print("正在訪問%s" %(second_url))
driver.get(second_url)

#回退到百度首頁
print("回退到百度首頁")
driver.back()

#前進到新聞頁
print("前進到新聞頁")
driver.forward()

#重新整理當前頁面
driver.refresh()

#檢視當前網頁url
print(driver.current_url)

#滑動進度條到最低端,使用javaScript
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(1)

#開啟新的選項卡,模擬javaScript
driver.execute_script('window.open()')

#切換選項卡,按列表切到第幾個選項卡
driver.switch_to_window(driver.window_handles[1])
driver.get('http://www.sougou.com')
time.sleep(3)

#關閉選項卡
driver.close()
time.sleep(1)
#關閉當前驅動器
driver.quit()

selenium的webdriver主要還是定位。。。定位方法有CSS定位器跟XPath或者使用id,這裡不詳細解釋,請自行使用


學校要求掛英語網站時間達到30個小時,但是那破網站一直斷。所以,咳咳。。本文簡單使用不斷重新整理的方法保持英語網站的Cookies

#coding = utf-8

"""
    author: 貫穿真Sh
    time: 2018年5月30日21:50:10

"""
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time


def english_login():
    """使用Chrome登入高校外語教學平臺
        返回值 - webdriver
    """
    #建立使用的瀏覽器
    driver = webdriver.Chrome()
    #登入網址
    driver.get('http://learn.unipus.cn')

    while True:
        username = input("請輸入賬號:")
        password = input("請輸入密碼:")
        
        #進行登入操作,鍵入相應的賬號密碼,定位使用XPATH
        driver.find_element_by_xpath('//*[@id="username"]').send_keys(username)
        driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)
        #按下一個按鈕,定位使用CSS定位器
        driver.find_element_by_css_selector('#LoginForm > table > tbody > tr:nth-child(3) > td:nth-child(2) > input').click()
        #隱式等待
        time.sleep(2)
        #若登入失敗則重新登入
        try:
            error = driver.find_element_by_css_selector('body > div:nth-child(3) > div.newlogin_box > div.newlogin_boxnew > div.rightlogin_box > div.third_rightwords > span')
            if error.text == '您輸入的賬號/密碼有錯。\n或是賬號已經失效。':
                print('登入失敗,請重新登入')
                driver.find_element_by_xpath('//*[@id="username"]').clear()
        except:
            print('登入成功')
            return driver


def into_fresh(driver):
    #顯式等待時間設定為10秒
    wait = WebDriverWait(driver, 10)
    #建立一個可點選按鈕物件
    link1 = EC.element_to_be_clickable((By.CSS_SELECTOR, '#BookClassDIV > table > tbody > tr > td:nth-child(2) > ul > li:nth-child(10) > a'))
    #顯示等待按鈕出現,直到按鈕可以被按下
    wait.until(link1).click()
    link2 = EC.element_to_be_clickable((By.CSS_SELECTOR, '#ico > ul > p:nth-child(1) > a'))
    wait.until(link2).click()
    #隱式等待2s
    time.sleep(2)
    #wait.until(EC.frame_to_be_available_and_switch_to_it(driver.window_handles[1]))    #不知用顯示等待報錯
    #切換選項卡
    driver.switch_to_window(driver.window_handles[1])
    link3 = EC.element_to_be_clickable((By.CSS_SELECTOR, 'body > div.box > div:nth-child(2) > ul > li:nth-child(2) > a > img'))
    wait.until(link3).click()

    #迴圈重新整理
    while True:
        #重新整理當前頁面
        driver.refresh()
        #列印當前時間
        now = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
        print(now)
        time.sleep(60)

if __name__ == '__main__':
    driver = english_login()
    into_fresh(driver)

子頁面frame

如果你用CSS定位器定位不到,那可能是因為在子頁面即frame裡, 需要切換到子頁面裡定位

就一句switch_to_frame。然後用完切回父節點


去除alert警告



建立,切換選項卡