1. 程式人生 > >通過currUrl 判斷登入163郵箱是否成功---Python

通過currUrl 判斷登入163郵箱是否成功---Python

# coding:utf-8
'''
4.1.1 id定位
	find_element_by_id('kw')
	find_element_by_id('su')
	find_element_by_id()方法通過id屬性來定位元素
4.1.2 name定位
	find_element_by_name('wd')

4.1.3 class定位
	find_element_by_class_name('s_ipt')

4.1.4 tag定位
	find_element_tag_name()

4.1.5 link定位
	find_element_by_link_text('新聞')

4.1.6 partial link定位
	<a class = 'mnav' name = 'tj_lang' href = '#'>一個很長很長很長的文字連結</a>
	定位如下:
	find_element_by_partial_link_text('一個很長的')
	find_element_by_partial_link_text('文字連結')
	find_element_by_partial_link_text()方法通過元素標籤對之間的部分文字資訊來定位元素

4.1.7 XPath定位
	XPath是一種在XML文件中定位元素的語言。

	絕對路徑
	find_element_by_xpath('/html/body/div[2]/div/div[4]/div/form/span/input')	

	利用元素屬性定位
	find_element_by_xpath('//input[@id = 'kw'')
	//表示當前頁面某個目錄下,input表示定位元素的標籤名,[@id = 'kw']表示這個元素的
	屬性值等於kw。
	
	-如果不想指定標籤名,也可以用星號(*)代替
	-find_element_by_xpath('//*[@class = 'bg_s_ipt_wr']/input')

	使用邏輯運算子
	-可以使用開發者管理工具,獲取XPath路徑
		//*[@id="auto-id-1540179517963"]

4.1.8 CSS定位
<span id="s_kw_wrap" class="bg s_ipt_wr quickdelete-wrap">
	<span class="soutu-btn"></span><input type="text" class="s_ipt" name="wd" 
	id="kw" maxlength="100" autocomplete="off"><a href="javascript:;" 
	id="quickdelete" title="清空" class="quickdelete" style="top: 0px; 
	right: 0px; display: none;"></a></span>

	-通過class屬性定位
		find_element_by_css_selector('.s_ipt')
	-通過ID屬性定位
		find_element_by_id_selector('#kw')
	-# 表示通過ID屬性定位元素
		通過標籤名定位元素
			find_element_by_css_selector('input')
		通過父子關係定位
			find_element_by_css_selector('span>input')
		通過屬性定位
			find_element_by_css_selector('name = 'kw'')

	-組合定位
		find_element_by_css_slector('span.bg s_ipt_wr > input.s)ipt')
		意思是,有一個父元素,他的標籤名叫span,他有一個class屬性值bg s_ipt_wr
			他有一個子元素,叫input,且其class屬性值叫s_ipt。
	
4.1.9 用By定位元素
	WebDirver還提供了另外一套寫法,即統一呼叫find_element(),通過By開宣告定位的方法,
	並且傳入對應定位方法的定位引數,具體如下:
		find_element(By.ID, 'kw')
		find_element(By.NAME, 'wd')
		find_element(By.CLASS_NAME, 's_ipt')
		find_element(By.TAG_NAME, 'input')
		find_element(By.LINK_TEXT, '新聞')
		find_element(By.PARTIAL_LINK_TEXT, '新')
		find_element(By.XPATH, '//*[@class = 'bg s_btn']')
		finf_element(By.CSS_SELECTOR,'span.bg s_btn_wr > input#su')
		find_element()方法只用於定位元素,他需要兩個引數,第一個引數是定位的型別,
			第二個引數是定位的具體方式,在使用By之前需要將By類匯入:
				from selenium.webdriver.common.by import By


'''
# 等待iframe載入,直到獲取到標籤
# WebDriverWait(self, driver, timeout, poll_frequency = POLL_FREQUENCY,
# ignired_exception = None)
'''
其中:
	driver: 傳入WebDriver例項,即我們上例中的driver
	timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
	poll_frequency: 呼叫until或until_not中的方法的間隔時間,預設是0.5秒
	ignored_exceptions: 忽略的異常,如果在呼叫until或until_not的過程中拋
	出這個元組中的異常,則不中斷程式碼,繼續等待,如果丟擲的是這個元組外的異常,
	則中斷程式碼,丟擲異常。預設只有NoSuchElementException。

	即:
	WebDriverWait(driver, 超時時長, 呼叫頻率,
	忽略異常).until(可執行方法, 超時時返回的資訊)

'''
import logging
import os
import datetime
import traceback
from threading import Thread, Lock
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from  selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

class Login():
	def __init__(self):
		self.browser = webdriver.Chrome()
		# self.url = ''

	def nullName(self):
		print('--------------NULL------------------')

	def login_Log(self):
    # 組合日誌檔名(當前檔名+當前時間).比如:case_login_success-20150817192533
		basename = os.path.splitext(os.path.basename(__file__))[0]
		print(basename)
		logFile = basename + "-" + datetime.datetime.now().strftime("%Y%m%d%H%M%S")+".log"
		logging.basicConfig(filename = logFile)  # 將日誌記錄到檔案中
		s = traceback.format_exc()
		logging.error(s)     # 記錄錯誤的日誌
		self.browser.get_screenshot_as_file("./"+logFile+"-error.png")  # 擷取登入的圖片


	def login(self, username, pw, url):
		self.browser.get(url)
		element = WebDriverWait(self.browser, 30, 0.5).until(EC.presence_of_element_located((By.XPATH, "//*[@id='x-URS-iframe']")))
		# 切換標籤
		self.browser.switch_to.frame('x-URS-iframe')
		# 定位到賬號框
		# inputText = browser.find_element(By.XPATH, '//*[@id = 'accound-box']//div[2]//input')
		try:
		# 輸入賬號和密碼
			inputText = self.browser.find_element(By.XPATH,"//*[@id='account-box']//div[2]//input")
			inputText.send_keys(username)
			password = self.browser.find_element(By.XPATH, "//*[@id='login-form']//div//div[3]//div[2]//input[2]")
			password.send_keys(pw)
			# time.sleep(2)
			# 模擬回車鍵
			password.send_keys(Keys.ENTER)
			time.sleep(3)
			urlname = 'WelcomeModule%7C%7B%7D'
			currUrl = self.browser.current_url
			# if currUrl == 'https://mail.163.com/js6/main.jsp?sid=mByNJRhTjHKgSBtCopTTboGboPTwORDC&df=email163#module=welcome.WelcomeModule%7C%7B%7D':
			if urlname in currUrl :
				print('登陸成功')	# "https://mail.163.com/js6/main.jsp?sid=WCVcOrFyJRbWJvtQTzyyWZQswpQsyPZz&df=mail163_letter#module=welcome.WelcomeModule%7C%7B%7D"
			else:
				# s = Login()
				# nullName(self)

				print('登入失敗!!!')
				self.login_Log()
		except:
			print('登入失敗')
			# 跟蹤日誌
			self.login_Log()

	
	def logout(self, browser):
		# self.browser.find_element_by_link_text('退出').click()
		# time.sleep(50)
		self.browser.quit()

其中,一個網友給的判斷方法是:

# if currUrl == 'https://mail.163.com/js6/main.jsp?sid=mByNJRhTjHKgSBtCopTTboGboPTwORDC&df=email163#module=welcome.WelcomeModule%7C%7B%7D':

但是,每次登入後的URL都是變化的,所以通過這一條進行判斷是行不通的。通過觀察發現,URL的後幾位的字串是保持不變的,應該是登入名一類的,可以判斷是否是這個登入名。】

# cond:utf-8
from attributeAddress import Login
from selenium import webdriver
# from simulate163 import Login

username = '999999999999'
pw = 'ra88888888'
url = 'https://mail.163.com/'
Login().login(username, pw, url)

這樣就可以成功啦!