一文學會使用selenium, 並實現登入掛英語網站不掉線
阿新 • • 發佈:2019-01-01
本文用於快速入門或者複習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。然後用完切回父節點