1. 程式人生 > >htmlunit模擬瀏覽器實現163郵箱自動登入

htmlunit模擬瀏覽器實現163郵箱自動登入

對於表單隱藏在js內,需要解析js並動態載入網頁,找了很多元件,包括httpunit,後來試驗htmlunit通過。感覺httpunit還是比htmlunit差點,所以建議用htmlunit來解析js動態載入的網頁並自動提交表單。對於模擬瀏覽器的htmlunit元件還是有很多需要挖掘,這樣才能試驗不同網站的通用性解析。

重點是:Htmlunit版本會爆出如sslcontext以及httpclient版本不相容問題,換了3個版本,最後2.18版本可以用。

htmlunit基礎程式碼如下:

package gddx;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
import com.gargoylesoftware.htmlunit.util.Cookie;

public class Email163Login {
	public static void main(String[] args) {
		try {
			//建立一個webclient
			WebClient webClient = new WebClient(BrowserVersion.CHROME); 
			
			//引數設定
			// 1 啟動JS
			webClient.getOptions().setJavaScriptEnabled(true);
			// 2 禁用Css,可避免自動二次請求CSS進行渲染
			webClient.getOptions().setCssEnabled(false);
			//3 啟動客戶端重定向
			webClient.getOptions().setRedirectEnabled(true);
			// 4 執行錯誤時,是否丟擲異常
			webClient.getOptions().setThrowExceptionOnScriptError(false);
			// 5 設定超時
			webClient.getOptions().setTimeout(50000);
			//6 設定忽略證書
			//webClient.getOptions().setUseInsecureSSL(true);
			//7 設定Ajax
			//webClient.setAjaxController(new NicelyResynchronizingAjaxController());
			//8設定cookie
			webClient.getCookieManager().setCookiesEnabled(true);
			
			//獲取頁面
			HtmlPage page = webClient.getPage("http://mail.163.com/");  
			// 根據form的名字獲取頁面表單,也可以通過索引來獲取:page.getForms().get(0)   
	        HtmlForm form = page.getFormByName("login163");       
	        HtmlTextInput username = (HtmlTextInput) form.getInputByName("username");
	        HtmlPasswordInput password = (HtmlPasswordInput) form.getInputByName("password");
	        username.setValueAttribute("sharpsword");
	        password.setValueAttribute("xyz");
	        HtmlButton button =(HtmlButton)page.getHtmlElementById("loginBtn");   
	        HtmlPage retPage = (HtmlPage) button.click();
			// 等待JS驅動dom完成獲得還原後的網頁
			webClient.waitForBackgroundJavaScript(10000);
			//輸出網頁內容
			System.out.println(retPage.asXml()); 
			//獲取cookie
			Set<Cookie> cookies = webClient.getCookieManager().getCookies();; 
			Map<String, String> responseCookies = new HashMap<String, String>();
			for (Cookie c : cookies) {
				responseCookies.put(c.getName(), c.getValue());
				System.out.print(c.getName()+":"+c.getValue());
			}
			
			//關閉webclient
			webClient.close(); 	
			}catch (Exception e) {System.err.println( "Exception: " + e ); }
	}
}


相關推薦

htmlunit模擬瀏覽器實現163郵箱自動登入

對於表單隱藏在js內,需要解析js並動態載入網頁,找了很多元件,包括httpunit,後來試驗htmlunit通過。感覺httpunit還是比htmlunit差點,所以建議用htmlunit來解析js動態載入的網頁並自動提交表單。對於模擬瀏覽器的htmlunit元件還是有很

163郵箱自動化登入實現模組化

from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains url = 'http://mail.163.com/'

Python模擬瀏覽器實現網頁訪問

Python 模擬瀏覽器訪問 模擬瀏覽器請求數據: import socket # 創建TCP鏈接 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # DNS 解析和鏈接HTTP服務器 tcp_socket.connect

QQ郵箱自動登入問題--frame巢狀元素定位

今天在自己編寫QQ郵箱自動登入的指令碼時遇到一個問題,看圖說話: 因此,正常來說都會想到要定位到“賬號密碼登入”,於是就定位到原始碼: 定位如下: driver.find_element_by_id('switcher_plogin').click() 返回提示找不到該

利用expect + sftp 實現遠端主機自動登入及下載

利用expect + sftp 實現遠端主機自動登入及下載: (ssh是一樣的) #!/usr/bin/expect -f ## Create by Cyril. ## "Usage:./downFilesFromStation USER PWD RemoteIP SourcePat

應用behave行為驅動框架實現QQ郵箱登入

為了更好地定位元素,首先要仔細分析某個系統登入時,他的登入頁面到底有幾個iframe元素,當有多個時,切登入框的iframe是獨立的話,需要先把frame切換到登入的iframe上,這樣才能對其上面的元素進行一系列操作!! 如圖所示是QQ郵箱的登入頁面 分析HTML對應的dom樹結構是什麼樣的,是否此

C# 163郵箱自動登陸

文章目錄 引言 163郵箱的不同 解決方案 20181030更新 引言 在C# 學校郵箱自動登陸中我們使用WebBrowser控制元件輕鬆地完成了學校郵箱的登陸,但是如果想用這個辦法來登入163郵箱,會找不到使用者名稱、密碼和登陸

JSP實現網頁的自動登入(session+cookie)實現

1、session的作用   使用者用瀏覽器訪問web伺服器時,會為每個使用者建立一個session(會話),session在使用者關閉瀏覽器之前都是有效的,所以我們可以在session中儲存使用者的一些資訊,以供使用。這裡我們用session儲存使用者的賬號名

使用jquery+jsdom模擬瀏覽器實現自動化測試

測試是需要自動化的,靠人測不僅慢而且不準確。 測試不是為了覆蓋住全部的錯誤,程式不可能通過測試來發現全部的問題,測試只是起到錦上添花的作用,測試只能在一定程度上減少基本錯誤。 selenium的自動化測試方案從使用者的角度測試,node的出現為前端自動化測試提供了新方法。 node中的全域性物件是global

spring boot結合spring security實現註冊後自動登入

spring boot結合spring security實現使用者註冊後自動登入 在開發過程中,有些頁面只有使用者登入之後才能訪問,比如使用者的個人中心,但是按道理使用者註冊之後也應該有許可權進入了個

C#實現遠端桌面自動登入

問題:A電腦登入B電腦 1,設定B電腦允許遠端登入 2,用A手動通過“遠端登入軟體”登入B,生成Default.rdp檔案 3.C#程式設計實現自動登入。 具體操作 1.設定B電腦允許遠端登入 http://jingyan.baidu.com/article/49711c

實現linux的自動登入--命令列模式啟動 .

linux的登入主要是由兩個檔案在控制,/usr/sbin/getty來獲得使用者名稱,並進行檢查使用者名稱是否存在,然後將使用者名稱傳遞給/usr/bin/login來獲取使用者輸入密碼和檢查密碼是否正確. 所以要實現linux的自動登入,就要改動這兩個檔案. 1.getty實現的主要功能是:   1)開

java 程式碼實現163郵箱傳送郵件到QQ郵箱

1.建立一個使用者類,來接收發送郵件的郵箱地址和授權密碼(需要注意的是,這裡的密碼不是正常使用郵箱的登陸密碼,而是客戶端生成的另一個專門的授權碼   ,這裡需要開啟相應的傳送郵件的服務,這裡開啟的是pop3/smtp服務)package appsoft.cd.applicat

修改PuTTY實現儲存密碼自動登入

一直鍾情於PuTTY的小巧精悍,是我SSH連線之必選。雖然喜歡這款軟體的小巧,但亦要承受其不方便之苦。最希望PuTTY新增的兩個功能是自動登入和Tab支援。這也是眾多使用者的wishlist,但官方已明確的斷了大家的念想。關於自動登入(auto-login password

OkHttp3.0(結合Retrofit2/Rxjava)利用攔截器實現全域性超時自動登入、新增統一引數

應用場景:1.服務端為了統計各個平臺、版本的使用情況,有時在介面中要求傳遞統一的諸如version(客戶端版本)、os(客戶端平臺android/iOS)、userId等引數,這時如果在介面中一一新增就比較繁瑣了,考慮做全域性處理;另外,一次登入成功後,

【2018.05.07】python3.6+selenium 實現自動登入126/163郵箱,然後傳送郵件

  # coding:utf-8 ''' 說明: 這個自動化指令碼要實現的是: 自動登入126/163郵箱, 傳送郵件遇到的問題:什麼時候切控制代碼, 有些總是定位不到的屬性如何定位(css)值得擁有 ''' from selenium import webdriver impor

[Python爬蟲] Selenium實現自動登入163郵箱和Locating Elements介紹

        前三篇文章介紹了安裝過程和通過Selenium實現訪問Firefox瀏覽器並自動搜尋"Eastmount"關鍵字及截圖的功能。而這篇文章主要簡單介紹如何實現自動登入163郵箱,同時繼續介紹Selenium+Python官網Locating Elements部

Python Selenium實現自動登入163郵箱

最近看了看Selenium,發現這個玩意是相當好用,於是我想自己寫一個郵箱自動登入的小程式,下面以登入163郵箱為例,一開始遇到了很多問題,在網上看了很多教程,發現也都失效了,經過一下午的摸索,終於找到了原因——在Web應用中經常會遇到frame/iframe

[selenium]實現自動登入163郵箱併發送郵件

一、最近在學習selenium,感覺功能蠻好的,先給一張效果圖: 二、程式碼如下: #-*-coding:utf-8-*- from selenium import webdriver fr

python 使用selenium webdriver編寫自動登入126或163郵箱併發送郵件的程式。

這是一個有問題的程式碼,擺弄了很久,找不到解決的辦法,希望看到我錯誤的大神給於留言指點。也可以發郵件給我,郵箱[email protected],大家有高明的解決方案,歡迎大佬指教。謝謝!我的問題主要出在點選“寫信”按鈕無反應。無法準確找到獲取該按鈕,並有反應的方法