政府網(wǎng)站建設(shè)多少錢商品促銷活動(dòng)策劃方案
拉票
親愛(ài)的小伙伴們或者童鞋們,喜歡宏哥文章的,請(qǐng)動(dòng)動(dòng)你們發(fā)財(cái)小手,給我投投票票 。
祝2025小伙伴們工作順利,家庭和睦,心想事成,財(cái)源滾滾!
我的票還有7票,互票的朋友私信給我。
投票鏈接:https://www.csdn.net/blogstar2024/detail/296
1.簡(jiǎn)介
跟隨宏哥學(xué)習(xí)的小伙伴或者童鞋們想必已經(jīng)在宏哥Python+Playwright系列文章中知道宏哥如何處理前邊文章中提到的反爬蟲(chóng)機(jī)制。今天跟隨宏哥看一下java語(yǔ)言是如何處理的,已經(jīng)按照之前的處理方式是否可以成功的處理呢?那么接下來(lái)就隨宏哥一步步來(lái)探索這個(gè)未知之謎。好了廢話不說(shuō),直接進(jìn)入今天的主題。
2.啟動(dòng)瀏覽器的模式
宏哥按照自己的理解將其分為兩種啟動(dòng)模式,一種是:無(wú)痕模式啟動(dòng)瀏覽器,另一種是:非無(wú)痕模式啟動(dòng)瀏覽器。
playwright 提供了launchPersistentContext啟動(dòng)瀏覽器的方法,可以非無(wú)痕模式啟動(dòng)瀏覽器。
無(wú)痕模式啟動(dòng)瀏覽器適合做自動(dòng)化測(cè)試的人員。
非無(wú)痕模式啟動(dòng)瀏覽器適合一些爬蟲(chóng)用戶人員。
2.1launchPersistentContext
官方API的文檔地址:瀏覽器類型 |Playwright Java
返回持久性瀏覽器上下文實(shí)例。
啟動(dòng)使用位于?userDataDir?的持久性存儲(chǔ)的瀏覽器,并返回唯一的上下文。關(guān)閉此上下文將自動(dòng)關(guān)閉瀏覽器。
2.2無(wú)痕模式啟動(dòng)瀏覽器
1.launch()方法是無(wú)痕模式啟動(dòng)瀏覽器。
參考代碼如下:
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號(hào):北京宏哥(微信搜索,關(guān)注宏哥,提前解鎖更多測(cè)試干貨)* * 《剛剛問(wèn)世》系列初窺篇-Java+Playwright自動(dòng)化測(cè)試-23- 操作鼠標(biāo)拖拽 - 番外篇(詳細(xì)教程)** 2024年02月14日*/
public class Test_Drag {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//使用chromium瀏覽器,# 瀏覽器配置,設(shè)置以GUI模式啟動(dòng)Chrome瀏覽器(要查看瀏覽器UI,在啟動(dòng)瀏覽器時(shí)傳遞?headless=false?標(biāo)志。您還可以使用?slowMo?來(lái)減慢執(zhí)行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));BrowserContext context = browser.newContext();//創(chuàng)建pagePage page = context.newPage();//瀏覽器打開(kāi)百度page.navigate("https://www.cnblogs.com/du-hong");//關(guān)閉pagepage.close();//關(guān)閉browserbrowser.close();}}
}
2.無(wú)痕模式啟動(dòng)瀏覽器,會(huì)在瀏覽器右上角出現(xiàn)“無(wú)痕模式”,如下圖所示:
2.3非無(wú)痕模式啟動(dòng)瀏覽器
1.如果網(wǎng)站被反爬蟲(chóng)機(jī)制識(shí)別或者被監(jiān)測(cè)無(wú)痕模式不能使用,那么可以用launchPersistentContext()方法進(jìn)行非無(wú)痕(有痕跡)模式啟動(dòng)瀏覽器。
相關(guān)參數(shù)說(shuō)明:
- userDataDir ?: 用戶數(shù)據(jù)目錄,此參數(shù)是必須的,可以自定義一個(gè)目錄
- setAcceptDownloads: 接收下載事件
- setHeadless: 是否設(shè)置無(wú)頭模式
- setChannel: 指定瀏覽器類型,默認(rèn)chromium
參考代碼如下:
package com.bjhg.playwright;import java.io.File;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號(hào):北京宏哥(微信搜索,關(guān)注宏哥,提前解鎖更多測(cè)試干貨)* * 《剛剛問(wèn)世》系列初窺篇-Java+Playwright自動(dòng)化測(cè)試-23- 操作鼠標(biāo)拖拽 - 番外篇(詳細(xì)教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(3000); BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); Page page = browserContext.newPage(); page.navigate("https://www.baidu.com");System.out.println("Test Pass");//關(guān)閉pagepage.close();//關(guān)閉browserbrowserContext.close();}}
}
2.宏哥發(fā)現(xiàn)以上代碼運(yùn)行后,會(huì)多出一個(gè)空白頁(yè)。如下圖所示:
3.進(jìn)入launchPersistentContext()方法,發(fā)現(xiàn)是因?yàn)槭褂胠aunchPersistentContext()方法會(huì)自動(dòng)打開(kāi)一個(gè)tab標(biāo)簽頁(yè),后面代碼browserContext.newPage()重新打開(kāi)了一個(gè)新的page對(duì)象。所以才會(huì)多一個(gè)空白頁(yè)。
解決辦法很簡(jiǎn)單,去掉browserContext.newPage()代碼即可。直接用默認(rèn)打開(kāi)發(fā)tab標(biāo)簽頁(yè)對(duì)象。
參考代碼如下:
package com.bjhg.playwright;import java.io.File;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號(hào):北京宏哥(微信搜索,關(guān)注宏哥,提前解鎖更多測(cè)試干貨)* * 《剛剛問(wèn)世》系列初窺篇-Java+Playwright自動(dòng)化測(cè)試-23- 操作鼠標(biāo)拖拽 - 番外篇(詳細(xì)教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(3000); BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); // Page page = browserContext.newPage(); Page page = browserContext.pages().get(0);page.navigate("https://www.baidu.com");System.out.println("Test Pass");//關(guān)閉pagepage.close();//關(guān)閉browserbrowserContext.close();}}
}
運(yùn)行代碼如下(可以清楚地看到?jīng)]有 新增的空白頁(yè)面了):
3.項(xiàng)目實(shí)戰(zhàn)
這里宏哥還用之前的那個(gè)實(shí)例進(jìn)行演示,也就是在文章最后提到反爬蟲(chóng)的那篇文章的例子:攜程旅行,注冊(cè)頁(yè)面的一個(gè)滑動(dòng),進(jìn)行項(xiàng)目實(shí)戰(zhàn)。如下圖所示:
3.1代碼設(shè)計(jì)
參考前邊提到的方法進(jìn)行代碼設(shè)計(jì)如下:
3.2參考代碼
package com.bjhg.playwright;import java.io.File;import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號(hào):北京宏哥(微信搜索,關(guān)注宏哥,提前解鎖更多測(cè)試干貨)* * 《剛剛問(wèn)世》系列初窺篇-Java+Playwright自動(dòng)化測(cè)試-23- 操作鼠標(biāo)拖拽 - 番外篇(詳細(xì)教程)** 2025年02月14日*/
public class Test_Dialog {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {BrowserType.LaunchPersistentContextOptions launch=new BrowserType.LaunchPersistentContextOptions(); launch.setViewportSize(1920,1080);launch.setAcceptDownloads(true);launch.setChannel("chrome");launch.setHeadless(false);launch.setSlowMo(5000); launch.setBypassCSP(true);BrowserContext browserContext = playwright.chromium().launchPersistentContext(new File("C:\\Users\\Administrator\\Desktop\\test").toPath(),launch); // Page page = browserContext.newPage(); Page page = browserContext.pages().get(0);//3.瀏覽器訪問(wèn)demopage.navigate("https://passport.ctrip.com/user/reg/home");page.locator("//*[@id='agr_pop']/div[3]/a[2]").click();//4.開(kāi)始拖拽//獲取拖動(dòng)按鈕位置并拖動(dòng)Locator slider = page.locator("//*[@id='slideCode']/div[1]/div[2]");// 使用鼠標(biāo)滑動(dòng)滑塊page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 2, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().down();// 根據(jù)滑動(dòng)的范圍,這里使用滑動(dòng)最大距離page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 0.5+380, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().up();//斷點(diǎn)調(diào)試page.pause();System.out.println("Test Pass");//關(guān)閉pagepage.close();//關(guān)閉browserbrowserContext.close();}}
}
3.3運(yùn)行代碼
1.運(yùn)行代碼,右鍵Run As->Java Application,就可以看到控制臺(tái)輸出,如下圖所示:
2.運(yùn)行代碼后電腦端的瀏覽器的動(dòng)作((可以清楚地的看到滑動(dòng)后,又出現(xiàn)了反爬蟲(chóng)機(jī)制,又彈出選字校驗(yàn)))。如下圖所示:
4.小結(jié)
宏哥在實(shí)踐的過(guò)程中,發(fā)現(xiàn)無(wú)論手動(dòng)還是利用上邊的代碼進(jìn)行自動(dòng)化測(cè)試都會(huì)出現(xiàn)那個(gè)反爬蟲(chóng)的機(jī)制彈出,因此宏哥懷疑最可能的問(wèn)題就是由于宏哥近期頻繁訪問(wèn)演示,可能被反爬蟲(chóng)的機(jī)制判斷后,進(jìn)行了IP鎖定,因此會(huì)出現(xiàn)這種情況,因?yàn)楹旮缭诘谝淮芜M(jìn)行手動(dòng)滑動(dòng)驗(yàn)證的時(shí)候,就沒(méi)有出現(xiàn)。所以宏哥懷疑是被鎖定了。一開(kāi)始宏哥以為是緩沖的問(wèn)題,宏哥清除瀏覽器緩沖和歷史記錄,然后重啟電腦最后結(jié)果仍然是一樣。所以宏哥懷疑被網(wǎng)站的反爬蟲(chóng)鎖定IP,最后經(jīng)過(guò)Python和Java的這部分實(shí)踐,宏哥覺(jué)得這種有痕跡的啟動(dòng)模式其實(shí)是說(shuō)白了,就是啟動(dòng)本地安裝的瀏覽器進(jìn)行自動(dòng)化測(cè)試,而非我們一開(kāi)始搭建環(huán)境時(shí)下載的瀏覽器。因?yàn)楹旮缭趫?zhí)行代碼的過(guò)程中報(bào)了一個(gè)無(wú)法找到本地安裝chrome的可執(zhí)行文件的路勁的錯(cuò)誤,將其安裝文件拷貝到此路徑下,代碼運(yùn)行正常沒(méi)有報(bào)錯(cuò)。宏哥也查了各種反爬蟲(chóng)機(jī)制的資料,進(jìn)行驗(yàn)證和實(shí)踐,折騰了半天還是沒(méi)有解決這個(gè)問(wèn)題,也不知道python和java語(yǔ)言的有什么區(qū)別了,還是因?yàn)楸绘i定,有點(diǎn)懵。但是宏哥回過(guò)頭來(lái)又用Python語(yǔ)言的處理方法試了一下這個(gè)注冊(cè)頁(yè)面,仍然可以成功處理,看來(lái)不是鎖定的問(wèn)題。但是其不是很穩(wěn)定啊,后邊在運(yùn)行代碼也會(huì)彈出選字校驗(yàn)。各位有什么好辦法可以留言給宏哥,抱歉了沒(méi)有幫到大家!
4.1實(shí)戰(zhàn)過(guò)程中遇到的坑及解決辦法
1.坑一:報(bào)錯(cuò)?message='Chromium distribution 'chrome' is not found at C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe ,如下圖所示:
解決辦法:找到chrome安裝路徑,將安裝文件全部拷貝到代碼中報(bào)錯(cuò)的路徑下即可,如下圖所示:
2.坑二:報(bào)錯(cuò)類似這樣 navigating to "https://passport.ctrip.com/user/reg/home", waiting until "load"。如下圖所示:
解決辦法:將launch.setSlowMo(50);的時(shí)間加長(zhǎng)即可。
4.2部分參數(shù)詳細(xì)說(shuō)明
1.launchPersistentContext創(chuàng)建的瀏覽器對(duì)象,為什么無(wú)法使用browser.newContext()創(chuàng)建上下文?
因?yàn)閘aunchPersistentContext字面上意思就已經(jīng)是一個(gè)context上下文對(duì)象了,所以無(wú)法創(chuàng)建上下文,只能創(chuàng)建page對(duì)象。
2.userDataDir路徑參數(shù)的作用什么?
userDataDir是指定瀏覽器啟動(dòng)的用戶數(shù)據(jù)緩存目錄,當(dāng)指定一個(gè)新的目錄時(shí),啟動(dòng)瀏覽器會(huì)發(fā)現(xiàn)自動(dòng)生成緩存文件。打開(kāi)C:\Users\\DELL\Desktop\Chrome\test目錄會(huì)看到加載的瀏覽器緩存文件。如下圖所示:
3.userDataDir能不能記住用戶登錄的狀態(tài)?
userDataDir就是你自己定義的打開(kāi)瀏覽器保存的用戶數(shù)據(jù),包含了用戶的cookies,所以你只要登錄過(guò),就會(huì)自動(dòng)保存。
所以你只要代碼打開(kāi)網(wǎng)站,如果不能通過(guò)代碼自動(dòng)登錄(可能有一些驗(yàn)證碼什么的),你可以斷點(diǎn)后手工去登錄一次,也會(huì)記住cookies。下次代碼再打開(kāi)就不需要登錄了。
4.為什么按你的教程,我這個(gè)網(wǎng)站就無(wú)法保持登錄?
能不能保持登錄狀態(tài),主要看你網(wǎng)站的cookies有效期,有些網(wǎng)站關(guān)閉瀏覽器后就失效了,比如一些銀行的網(wǎng)站,你只要關(guān)閉瀏覽器窗口,下次就需要再次登錄。
簡(jiǎn)單來(lái)說(shuō)一句話:你手工去操作一次,關(guān)閉瀏覽器,再打開(kāi)還要不要登錄,如果關(guān)閉瀏覽器需要再次登錄,那代碼也沒(méi)法做到保持登錄。
有些博客網(wǎng)站,你登錄一次,cookies幾個(gè)月都有效,這種就可以利用緩存的cookies保持登錄。
5.為什么網(wǎng)上其他教程userDataDir寫chrome的安裝目錄?
其實(shí)沒(méi)必要非要寫chrome的安裝目錄"C:\Users\{getpass.getuser()}\AppData\Local\Google\Chrome\UserData"。
如果你寫的是系統(tǒng)默認(rèn)安裝目錄的用戶數(shù)據(jù),那你本地瀏覽器打開(kāi)后,執(zhí)行代碼就會(huì)報(bào)錯(cuò)。所以不推薦!
6.默認(rèn)啟動(dòng)的是chromium瀏覽器,能不能換成其他的瀏覽器?
可以通過(guò)"channel"參數(shù)指定瀏覽器,可以支持chromium系列:chromium、chrome、chrome-beta、msedge。