- 《Python实战进阶》No23: 使用 Selenium 自动化浏览器操作
带娃的IT创业者
Python实战进阶pythonselenium自动化
No23:使用Selenium自动化浏览器操作摘要Selenium是自动化浏览器操作的“瑞士军刀”,可模拟人类行为操作网页,适用于爬虫、测试、重复任务自动化等场景。本集通过代码驱动实战,从安装配置到复杂交互,带你掌握Selenium的核心技能,并结合电商网站登录、商品下单等真实场景,解决动态加载、反爬等实际问题。核心概念与代码实战1.环境配置与WebDriver基础安装命令:pipinstalls
- python webdriver-manager 实现selenium 免下载安装webdriver
小马MT
pythonselenium爬虫
pythonwebdriver-manager实现selenium免下载安装webdriverselenium在自动化测试中,通常需要使用浏览器驱动来与浏览器进行交互。然而,手动下载、安装、以及管理这些驱动非常麻烦,尤其是当驱动版本频繁更新时。为此,webdriver-manager库提供了一个极简的方案,自动帮我们下载、更新和管理驱动,使Selenium代码更简洁优雅。webdriver-man
- Selenium WebDriver Manager 安装与配置完全指南
m0_74824025
seleniumpython测试工具
SeleniumWebDriverManager安装与配置完全指南webdrivermanagerWebDriverManager是一个用于自动化管理Web驱动程序的Java库,可以用于自动化下载,配置和管理Web驱动程序,支持多种Web驱动程序,如ChromeDriver,FirefoxDriver,SafariDriver等,可以用于自动化测试和Web应用程序开发。[这里是图片001]项目地址
- Python+Selenium 使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题_web自动化最新版本浏览器驱动,驱动连接不了浏览器
2401_84140040
程序员python学习面试
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。(1)Python所有方向的学习路线(
- ChromeDriver介绍和使用
Chen_Chance
chrome
什么是ChromeDriver?ChromeDriver是一个用于在自动化测试中控制GoogleChrome浏览器的工具。它是SeleniumWebDriver的一部分,可以让开发者通过编程的方式操作浏览器进行各种测试。ChromeDriver充当了WebDriver和Chrome浏览器之间的桥梁,使得测试脚本能够与浏览器交互。为什么使用ChromeDriver?在现代软件开发中,确保网页在不同浏
- Selenium的键盘操作,组合键(4)
一直开心
python开发语言
#键盘操作,组合键fromtimeimportsleepfromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.common.byimportBydriver=webdriver.Chrome()driver.get('https://www.baidu.com/')
- selenium鼠标操作
不断成长lj
selenium测试工具
fromselenium.webdriver.common.keysimportKeys#导入键盘操 语法:send_keys(Keys.BACK_SPACE)删除键(BackSpace)send_keys(Keys.TAB)制表键(Tab)send_keys(Keys.SPACE)空格键(Space)send_keys(Keys.ESCAPE)回退键(Esc)send_keys(Keys.ENT
- selenium鼠标操作大全
Guff_hys
python开发语言
selenium鼠标操作大全#导包fromseleniumimportwebdriverfromtimeimportsleep#获取浏览器驱动对象driver=webdriver.Edge()#打开urlurl=r"C:\Users\黄永生\Desktop\软件测试\P2C电子市场\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册A.html"driver.get(url)"
- 【UI自动化】Selenium库中使用By类元素定位方法
搞不来测试的摄影狮
软件测试pythonselenium自动化
使用By类,首先需要在Python中导入该模块:fromselenium.webdriver.common.byimportBy1.通过元素的ID属性来定位driver.find_element(By.ID,'kw')如下图,我们需要定位百度的输入框。首先选中定位工具,然后选中输入框。我们可以看到该元素id的值为:"kw"2.通过元素的NAME属性来定位driver.find_element(By
- Web UI自动化测试--元素操作
每 天 早 睡
持续集成与自动化测试ui
一、介绍什么是webui自动化测试1、通过代码来模拟人的手工操作,执行测试内容2、自动化是为了代替重复的手工操作,提高测试效率ui自动化的价值:1、回归速度的对比,以前进行全量回归测试需要x天,现在有没有减少2、负责功能测试的同事,是不是有更多的时间测试新需求了3、自动化测试不是为了发现bug,而是为手工测试节省回归时间ui自动化的原理(selenium与webdriver):selenium是一
- python爬取酷狗音乐的mv地址_爬取酷狗音乐.py
HAR.王帅真
importrequestsfromseleniumimportwebdriverfrompyqueryimportPyQueryaspq#获取歌名defAccess_to_the_song(C):doc=pq(C)The_song=doc('.audioName').text()returnThe_song#进入听歌的界面爬取HTMLdefBrowser_access(URL):The_brow
- 【源代码】python爬虫,爬取足球赛制比分
码农之家★资源共享
python爬虫开发语言
完整代码!fromseleniumimportwebdriverfromselenium.common.exceptionsimportNoSuchElementExceptionfromselenium.webdriver.common.keysimportKeysimporttimefrombs4importBeautifulSoupimportselectimportsocketimpor
- Python 中自动打开网页并点击[自动化脚本],Selenium
Ben_F
Pythonpython自动化selenium
要在Python中自动打开网页并点击第一个标签,你需要使用Selenium,它可以控制浏览器并执行像点击这样的操作。requests和BeautifulSoup只能获取并解析网页内容,但不能进行网页交互操作。步骤:安装Selenium安装WebDriver(例如ChromeDriver)编写代码来自动点击网页的第一个标签1.安装Selenium使用pip安装Selenium:pipinstalls
- android自动化测试 python3.0+appium+uiautomatorviewer+unittest+csv+HTMLTestRunner 登录测试框架
luoyangcoding
app自动化测试app登录自动化脚本
#coding:utf-8importcsv#导入csv库,可以读取csv文件fromappiumimportwebdriverimportunittest#单元测试fromtimeimportsleep#等待时间importtime#时间方法importos#文件、目录方法importsys#引用系统函数fromHTMLTestRunnerimportHTMLTestRunner#定义路径变量,
- 初学者瞎写的一个爬虫小程序
一大块腹肌呀
爬虫小程序python
学习python三个月,渐渐的的也开始了爬虫之旅,根据某本书的指导,开始想写一个通用的爬虫小程序,希望有大神能指点一下。importdatetimeimporttimefromseleniumimportwebdriverimportreclassMyCommonSpider:def__init__(self):pass使用了selenium进行模拟鼠键操作,目标是爬取51job上的职位信息def
- Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】
我是神哥
selenium指定端口谷歌浏览器
就是在写动态爬虫爬取数据的过程中,如果用selenium的话,有一个缺点,就是当我们去测试一个网站能不能爬取,它都会重新换端口打开一个浏览器,不会使用上一次使用的浏览器,在实际使用过程中这样调试很烦,总是会重新打开而不是就用上一次打开过的调试。所以我就在想,怎么让它每一次都打开同一个浏览器呢?刚开始,借鉴网上都是这种:importtimefromseleniumimportwebdriverfro
- python selenium兼容性_Selenium学习整理(Python)
k程
pythonselenium兼容性
1准备软件SeleniumIDEfirebug-2.0.19.xpifirepath-0.9.7-fx.xpiFirefox_46.0.1.5966_setup.exe由于火狐浏览器高版本以后就不支持firebug,最好下载安装49版本以下的。selenium_ide-2.9.1.xpiWebDriverpipinstallseleniumchromedriver.exeIEDriverServe
- Selenium元素定位:深入探索与实践
傻啦嘿哟
python办公自动化selenium测试工具
目录一、引言二、Selenium元素定位基础1.WebDriver与元素定位2.定位策略概览三、ID定位1.特点与优势2.示例代码四、ClassName定位1.特点与限制2.示例代码五、XPath定位1.特点与优势2.示例代码3.XPath高级用法六、CSSSelector定位1.特点与优势2.示例代码3.CSSSelector高级用法七、其他定位策略1.Name定位2.TagName定位3.Li
- selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate elemen
挽风821
软件测试selenium测试工具
报错原因:页面还没加载完,就开始找元素了使用time.sleep()等待几秒就可以了#创建ChromeWebDriverdriver=webdriver.Chrome(service=Service('D:\ProgramFiles\python\python3.10.0\chromedriver.exe'),options=chrome_options)driver.maximize_windo
- python免费网课-用Python来自动刷智慧树网站的网课
编程大乐趣
fromseleniumimportwebdriverfromselenium.webdriver.support.waitimportWebDriverWaitfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.common.
- Web Snapshot 网页截图 模块代码详解
魔王阿卡纳兹
Python学习札记开源项目观察前端Python网页截图
本文将详细解析WebSnapshot模块的实现原理和关键代码。这个模块主要用于捕获网页完整截图,特别优化了对动态加载内容的处理。1.模块概述snapshot.py是一个功能完整的网页截图工具,它使用Selenium和ChromeWebDriver来模拟真实浏览器行为,确保能够捕获到动态加载的内容。1.1核心依赖fromseleniumimportwebdriverfromselenium.webd
- python-selenium控制浏览器多开窗口
一晌小贪欢
Python自动化办公seleniumpythonseleniumchrome
1、视频展示-多开5个百度页面目录结构只要在当前目录下放上自己所在的谷歌驱动器:谷歌驱动器如何下载,请参考博客:请点我奉上代码importtimefromseleniumimportwebdriver
- Selenium—显式等待中的EC模块参数大全
far_208
selenium测试工具
最近学到了expected_conditions模块(在使用时通常重命名为EC模块),在显式等待WebDriverWait的until和until_not方法中我们经常要用到,它会根据网页标题、网址以及元素是否可见等条件来决定我们是否需要继续等待。后面又使用到了其他参数,根据各大类型对它们做了个整理,方便记忆。因为要使用expected_conditions(EC)模块中的类,所以第一步肯定是要引
- Python 用 Selenium & DataFrame 提取网页内表格数据
solosoft
pythonselenium
提取的数据导入DataFrame,方便后期处理frompandas.core.frameimportDataFramefromseleniumimportwebdriverdriver=webdriver.Edge();driver.get("http://data.eastmoney.com/hsgt/index.html")table_content=driver.find_element_b
- 解决selenium的WebDriver object has no attribute ‘find_element_by_xpath‘问题
追逐程序梦想者
seleniumpython测试工具
解决selenium的WebDriverobjecthasnoattribute'find_element_by_xpath’问题在使用selenium操作浏览器时,常见的一种定位元素的方式就是Xpath定位。但有时候会出现WebDriverobjecthasnoattribute'find_element_by_xpath’的错误提示,意思是WebDriver对象没有该方法。这通常是因为引入se
- Python爬虫库Selenium
.NET跨平台
Selenium库是一个自动化测试工具,支持多种浏览器。在爬虫中主要解决JavaScript渲染的问题。用法讲解:0.基本用法fromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.sup
- Python selenium 库
ONE_PUNCH_Ge
python
Selenium是一个用于自动化Web浏览器操作的强大工具,广泛应用于Web应用程序测试、网页数据抓取和任务自动化等场景。Selenium为各种编程语言提供了API,用作测试。目前的官方API文档有C#、JavaScript、Java、Python、Ruby。安装Selenium和WebDriver安装Selenium要开始使用Selenium,首先需要安装selenium库,并下载适用于你浏览器
- CEF桌面应用的自动化
大胖丫
自动化pythonseleniumpython
开发跨平台桌面软件,目前比较流行的框架有CEF,是基于Chromium浏览器内核的。这样的PC应用,同样可以使用Selenium进行自动化测试。但是,selenium,是怎么启动浏览器的,大家,就需要去了解下webdriver原理。知道怎么用webdriver去操控浏览器,就知道了,怎么去操控桌面软件。那在WebDriver脚本运行的时候,它们之间是如何通信的呢?为什么同一个browserdriv
- python爬虫之自动化爬取网页
陌小
pythonseleniumpythonchrome
以下为公开源码fromseleniumimportwebdriverfromselenium.webdriver.chrome.optionsimportOptionsimporttimefrombs4importBeautifulSoupurl='https://movie.douban.com/'chrome_optins=Options()chrome_optins.add_argument
- 探索Golang-WDA:iOS自动化测试的新星
花谦战
探索Golang-WDA:iOS自动化测试的新星gwdaWebDriverAgent(iOS)ClientLibraryinGolang项目地址:https://gitcode.com/gh_mirrors/gw/gwda在移动应用的开发与测试领域,自动化测试工具的选择至关重要。今天,我们将深入探讨一个新兴的开源项目——Golang-WDA,它以其独特的技术优势和广泛的应用场景,正逐渐成为iOS自
- C/C++Win32编程基础详解视频下载
择善Zach
编程C++Win32
课题视频:C/C++Win32编程基础详解
视频知识:win32窗口的创建
windows事件机制
主讲:择善Uncle老师
学习交流群:386620625
验证码:625
--
- Guava Cache使用笔记
bylijinnan
javaguavacache
1.Guava Cache的get/getIfPresent方法当参数为null时会抛空指针异常
我刚开始使用时还以为Guava Cache跟HashMap一样,get(null)返回null。
实际上Guava整体设计思想就是拒绝null的,很多地方都会执行com.google.common.base.Preconditions.checkNotNull的检查。
2.Guava
- 解决ora-01652无法通过128(在temp表空间中)
0624chenhong
oracle
解决ora-01652无法通过128(在temp表空间中)扩展temp段的过程
一个sql语句后,大约花了10分钟,好不容易有一个结果,但是报了一个ora-01652错误,查阅了oracle的错误代码说明:意思是指temp表空间无法自动扩展temp段。这种问题一般有两种原因:一是临时表空间空间太小,二是不能自动扩展。
分析过程:
既然是temp表空间有问题,那当
- Struct在jsp标签
不懂事的小屁孩
struct
非UI标签介绍:
控制类标签:
1:程序流程控制标签 if elseif else
<s:if test="isUsed">
<span class="label label-success">True</span>
</
- 按对象属性排序
换个号韩国红果果
JavaScript对象排序
利用JavaScript进行对象排序,根据用户的年龄排序展示
<script>
var bob={
name;bob,
age:30
}
var peter={
name;peter,
age:30
}
var amy={
name;amy,
age:24
}
var mike={
name;mike,
age:29
}
var john={
- 大数据分析让个性化的客户体验不再遥远
蓝儿唯美
数据分析
顾客通过多种渠道制造大量数据,企业则热衷于利用这些信息来实现更为个性化的体验。
分析公司Gartner表示,高级分析会成为客户服务的关键,但是大数据分析的采用目前仅局限于不到一成的企业。 挑战在于企业还在努力适应结构化数据,疲于根据自身的客户关系管理(CRM)系统部署有效的分析框架,以及集成不同的内外部信息源。
然而,面对顾客通过数字技术参与而产生的快速变化的信息,企业需要及时作出反应。要想实
- java笔记4
a-john
java
操作符
1,使用java操作符
操作符接受一个或多个参数,并生成一个新值。参数的形式与普通的方法调用不用,但是效果是相同的。加号和一元的正号(+)、减号和一元的负号(-)、乘号(*)、除号(/)以及赋值号(=)的用法与其他编程语言类似。
操作符作用于操作数,生成一个新值。另外,有些操作符可能会改变操作数自身的
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
aijuans
嵌入式学习
笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为基于Linux操作系统编程,讲这个思想转变的书几乎没有,让初学者走了很多弯路,撞了很多难墙。
笔者因此写上自己的学习心得,希望能给和我一样转变
- 在springmvc中解决FastJson循环引用的问题
asialee
循环引用fastjson
我们先来看一个例子:
package com.elong.bms;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import co
- ArrayAdapter和SimpleAdapter技术总结
百合不是茶
androidSimpleAdapterArrayAdapter高级组件基础
ArrayAdapter比较简单,但它只能用于显示文字。而SimpleAdapter则有很强的扩展性,可以自定义出各种效果
ArrayAdapter;的数据可以是数组或者是队列
// 获得下拉框对象
AutoCompleteTextView textview = (AutoCompleteTextView) this
- 九封信
bijian1013
人生励志
有时候,莫名的心情不好,不想和任何人说话,只想一个人静静的发呆。有时候,想一个人躲起来脆弱,不愿别人看到自己的伤口。有时候,走过熟悉的街角,看到熟悉的背影,突然想起一个人的脸。有时候,发现自己一夜之间就长大了。 2014,写给人
- Linux下安装MySQL Web 管理工具phpMyAdmin
sunjing
PHPInstallphpMyAdmin
PHP http://php.net/
phpMyAdmin http://www.phpmyadmin.net
Error compiling PHP on CentOS x64
一、安装Apache
请参阅http://billben.iteye.com/admin/blogs/1985244
二、安装依赖包
sudo yum install gd
- 分布式系统理论
bit1129
分布式
FLP
One famous theory in distributed computing, known as FLP after the authors Fischer, Lynch, and Patterson, proved that in a distributed system with asynchronous communication and process crashes,
- ssh2整合(spring+struts2+hibernate)-附源码
白糖_
eclipsespringHibernatemysql项目管理
最近抽空又整理了一套ssh2框架,主要使用的技术如下:
spring做容器,管理了三层(dao,service,actioin)的对象
struts2实现与页面交互(MVC),自己做了一个异常拦截器,能拦截Action层抛出的异常
hibernate与数据库交互
BoneCp数据库连接池,据说比其它数据库连接池快20倍,仅仅是据说
MySql数据库
项目用eclipse
- treetable bug记录
braveCS
table
// 插入子节点删除再插入时不能正常显示。修改:
//不知改后有没有错,先做个备忘
Tree.prototype.removeNode = function(node) {
// Recursively remove all descendants of +node+
this.unloadBranch(node);
// Remove
- 编程之美-电话号码对应英语单词
bylijinnan
java算法编程之美
import java.util.Arrays;
public class NumberToWord {
/**
* 编程之美 电话号码对应英语单词
* 题目:
* 手机上的拨号盘,每个数字都对应一些字母,比如2对应ABC,3对应DEF.........,8对应TUV,9对应WXYZ,
* 要求对一段数字,输出其代表的所有可能的字母组合
- jquery ajax读书笔记
chengxuyuancsdn
jQuery ajax
1、jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()
- JWFD工作流拓扑结构解析伪码描述算法
comsci
数据结构算法工作活动J#
对工作流拓扑结构解析感兴趣的朋友可以下载附件,或者下载JWFD的全部代码进行分析
/* 流程图拓扑结构解析伪码描述算法
public java.util.ArrayList DFS(String graphid, String stepid, int j)
- oracle I/O 从属进程
daizj
oracle
I/O 从属进程
I/O从属进程用于为不支持异步I/O的系统或设备模拟异步I/O.例如,磁带设备(相当慢)就不支持异步I/O.通过使用I/O 从属进程,可以让磁带机模仿通常只为磁盘驱动器提供的功能。就好像支持真正的异步I/O 一样,写设备的进程(调用者)会收集大量数据,并交由写入器写出。数据成功地写出时,写入器(此时写入器是I/O 从属进程,而不是操作系统)会通知原来的调用者,调用者则会
- 高级排序:希尔排序
dieslrae
希尔排序
public void shellSort(int[] array){
int limit = 1;
int temp;
int index;
while(limit <= array.length/3){
limit = limit * 3 + 1;
- 初二下学期难记忆单词
dcj3sjt126com
englishword
kitchen 厨房
cupboard 厨柜
salt 盐
sugar 糖
oil 油
fork 叉;餐叉
spoon 匙;调羹
chopsticks 筷子
cabbage 卷心菜;洋白菜
soup 汤
Italian 意大利的
Indian 印度的
workplace 工作场所
even 甚至;更
Italy 意大利
laugh 笑
m
- Go语言使用MySQL数据库进行增删改查
dcj3sjt126com
mysql
目前Internet上流行的网站构架方式是LAMP,其中的M即MySQL, 作为数据库,MySQL以免费、开源、使用方便为优势成为了很多Web开发的后端数据库存储引擎。MySQL驱动Go中支持MySQL的驱动目前比较多,有如下几种,有些是支持database/sql标准,而有些是采用了自己的实现接口,常用的有如下几种:
http://code.google.c...o-mysql-dri
- git命令
shuizhaosi888
git
---------------设置全局用户名:
git config --global user.name "HanShuliang" //设置用户名
git config --global user.email "
[email protected]" //设置邮箱
---------------查看环境配置
git config --li
- qemu-kvm 网络 nat模式 (四)
haoningabc
kvmqemu
qemu-ifup-NAT
#!/bin/bash
BRIDGE=virbr0
NETWORK=192.168.122.0
GATEWAY=192.168.122.1
NETMASK=255.255.255.0
DHCPRANGE=192.168.122.2,192.168.122.254
TFTPROOT=
BOOTP=
function check_bridge()
- 不要让未来的你,讨厌现在的自己
jingjing0907
生活 奋斗 工作 梦想
故事one
23岁,他大学毕业,放弃了父母安排的稳定工作,独闯京城,在家小公司混个小职位,工作还算顺手,月薪三千,混了混,混走了一年的光阴。 24岁,有了女朋友,从二环12人的集体宿舍搬到香山民居,一间平房,二人世界,爱爱爱。偶然约三朋四友,打扑克搓麻将,日子快乐似神仙; 25岁,出了几次差,调了两次岗,薪水涨了不过百,生猛狂飙的物价让现实血淋淋,无力为心爱银儿购件大牌
- 枚举类型详解
一路欢笑一路走
enum枚举详解enumsetenumMap
枚举类型详解
一.Enum详解
1.1枚举类型的介绍
JDK1.5加入了一个全新的类型的”类”—枚举类型,为此JDK1.5引入了一个新的关键字enum,我们可以这样定义一个枚举类型。
Demo:一个最简单的枚举类
public enum ColorType {
RED
- 第11章 动画效果(上)
onestopweb
动画
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
- Eclipse中jsp、js文件编辑时,卡死现象解决汇总
ljf_home
eclipsejsp卡死js卡死
使用Eclipse编辑jsp、js文件时,经常出现卡死现象,在网上百度了N次,经过N次优化调整后,卡死现象逐步好转,具体那个方法起到作用,不太好讲。将所有用过的方法罗列如下:
1、取消验证
windows–>perferences–>validation
把 除了manual 下面的全部点掉,build下只留 classpath dependency Valida
- MySQL编程中的6个重要的实用技巧
tomcat_oracle
mysql
每一行命令都是用分号(;)作为结束
对于MySQL,第一件你必须牢记的是它的每一行命令都是用分号(;)作为结束的,但当一行MySQL被插入在PHP代码中时,最好把后面的分号省略掉,例如:
mysql_query("INSERT INTO tablename(first_name,last_name)VALUES('$first_name',$last_name')");
- zoj 3820 Building Fire Stations(二分+bfs)
阿尔萨斯
Build
题目链接:zoj 3820 Building Fire Stations
题目大意:给定一棵树,选取两个建立加油站,问说所有点距离加油站距离的最大值的最小值是多少,并且任意输出一种建立加油站的方式。
解题思路:二分距离判断,判断函数的复杂度是o(n),这样的复杂度应该是o(nlogn),即使常数系数偏大,但是居然跑了4.5s,也是醉了。 判断函数里面做了3次bfs,但是每次bfs节点最多