导航:
论坛 -> 网络通讯
斑竹:liumazi,sephil
作者:
2018/4/27 13:40:51
标题:
鄙人写的开源WebDriver4D
浏览:5383
加入我的收藏
楼主:
https://github.com/Ericwang1104/WebDriver4D 可用于 爬虫及web 测试。 目前封装了ie firefox chrome edge 以及Phantomjs 无头浏览器的访问。
----------------------------------------------
火鸟
作者:
2018/4/27 13:47:19
1楼:
不知道是是干啥用的,谁给科普一下
----------------------------------------------
-
作者:
2018/4/27 14:07:44
2楼:
为啥不去参战 三层 搞这么个玩意..干啥的?.......
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
bdl1 (bdl1)
▲▲▲▲▲
-
普通会员
2018/4/27 14:49:48
3楼:
支持一下,虽然不知怎么用。
----------------------------------------------
-我的博客
作者:
2018/4/27 15:42:01
4楼:
三层是不可能三层的,这辈子都不可能三层。代码又不太会写,就是搜索剪贴复制这种东西,才能维持得了生活的样子。泡论坛像是回家一样,灌起水来比编程感觉好多了!盒子里面个个都是人才,说话又好听,吵架都和外面不一样,我超喜欢盒子的!
----------------------------------------------
-
作者:
2018/4/27 15:47:22
5楼:
不去参战中间件,跑这搞这个干啥? 人生短短几十年,该折腾的时候就一定要抓紧时间折腾。
----------------------------------------------
--
作者:
2018/4/27 16:17:54
6楼:
这个东西可用于 爬取数据 ,python 里面有个WEbdriver 大家主要用它取爬取数据,可以完整模拟浏览器操作,另外也可用于web 填充测试 也可以用于制作表单填充工具。
----------------------------------------------
火鸟
作者:
2018/4/27 17:37:35
7楼:
试了一下,好东西呀~~ 但低版本的Delphi使用起来有些麻烦,要改动一些代码,WD_httpDelphi.pas 里面的HTTPClient对象建议默认使用indy的版本,要不然低版本的Delphi无法使用
----------------------------------------------
Delphi MlSkin 它能让你的程序拥有像QQ一样多彩炫丽的外观 http://www.pngui.com ;http://www.xeframework.com
作者:
2018/4/27 19:20:48
8楼:
为什么要兼容低版本。 低版本问题太多。不推荐用。
----------------------------------------------
(C)(P)Flying Wang
作者:
2018/4/27 19:32:30
10楼:
这个不错,支持一下。
----------------------------------------------
-
作者:
2018/4/27 21:36:15
11楼:
shinyv (辛雨) 哈哈,人才, 三层是不可能三层的,这辈子都不可能三层。代码又不太会写,就是搜索剪贴复制这种东西,才能维持得了生活的样子。泡论坛像是回家一样,灌起水来比编程感觉好多了!盒子里面个个都是人才,说话又好听,吵架都和外面不一样,我超喜欢盒子的!
----------------------------------------------
-相互学习,共同进步! 努力每一天,不能望山跑死马 发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行
作者:
2018/4/28 12:01:55
12楼:
这个如何判断网页已经加载完毕?通过延时好像不能准确知道是否加载完毕。
----------------------------------------------
-
作者:
2018/4/28 12:31:08
13楼:
@Fgrcwp 能通过判断completed 状态来 判断,不过我在GEtURL 已经做了这个操作了。只有加载完成才会返回。
----------------------------------------------
火鸟
作者:
go_on (go_on)
★☆☆☆☆
-
盒子活跃会员
2018/4/28 12:42:43
14楼:
好东西,mark一下,如果做爬虫是可以用上的,感谢楼主开源
----------------------------------------------
-
作者:
2018/4/28 13:20:36
15楼:
@wac1104 那登录跳转后的页面如何判断已经加载完成呢?应该在哪里判断?
----------------------------------------------
-
作者:
2018/4/28 14:52:24
16楼:
很棒!可惜我的低版本Delphi不支持。当时仍然很棒!
----------------------------------------------
-
作者:
2018/4/28 14:56:52
16楼:
支持数据达人。 东西不错的。 加载这一个,其实很简单的,隐式等待,并通过xpath,css selector 来判断目标是否成功加载了。
----------------------------------------------
-
作者:
2018/4/28 15:30:43
17楼:
FWD := TPhantomjs.Create(nil); FWD.Address := '127.0.0.1'; FWD.Port := 8080; FWD.LogFile := 'ie_log.log'; FWD.StartDriver('phantomjs.exe');//路径正确 Sleep(500); FWD.NewSession; FWD.GetURL('https://mail.163.com& #39;); Sleep(3000); Element := FWD.FindElementByXPath('//input[@name="email" and @data-loginname="loginEmail"]'); FWD.SendKey(Element, 'demo'); Element := FWD.FindElementByXPath('//input[@name="password" and @type="password"]'); FWD.SendKey(Element, 'demo'); Element := FWD.FindElementByID('dologin'); FWD.ElementClick(Element); 用网易邮箱测试,FindElementByXPath提示找不到网页元素,连直接用FindElementByID也是找不到,确信网页元素id没有错,不知何解?用微博测试相同方法却可以正确找到网页元素。
----------------------------------------------
-
作者:
2018/4/28 15:46:22
18楼:
可能是元素没有加载过来,应该在前面判断一下此元素是否已经加载再去操作; py 里面可以用WebDriverWait,这就需要作者实现一个类似的方法了
----------------------------------------------
Delphi MlSkin 它能让你的程序拥有像QQ一样多彩炫丽的外观 http://www.pngui.com ;http://www.xeframework.com
作者:
2018/4/28 15:55:55
19楼:
我甚至加了延时8秒10秒后再取都取不到,而网页正常打开都不超过3秒,我觉得不应该是还没加载完的原因。
----------------------------------------------
-
作者:
2018/4/28 16:02:13
20楼:
爬虫不能自给跑js基本就是 爬静态数据咯. (没看WebDriver4D).还用不到
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2018/4/28 16:17:43
21楼:
我觉得你应该先在python之类的里测试你的代码逻辑是否有问题。然后再转到Delphi,这样就可以确实是 Webdriver4D的问题还是 你代码本身的问题了。 另外,有些网页有反爬机制,很多text,submit之类的,不能直接通过js来取或者赋值的。
----------------------------------------------
-
作者:
2018/4/28 16:20:18
22楼:
@crystalmoon 我是想测试一下看看Webdriver4D是否可用于满足我的需要,如果测试没有问题才考虑转Delphi。方法完全是借鉴Webdriver4D里面的例子,只是换了一个测试网站而已。
----------------------------------------------
-
作者:
2018/4/28 16:23:27
23楼:
注意:Webdriver4D只是D下的一个 WebDriver 实现 还是这句话,有些网页有反爬机制,很多text,submit之类的,不能直接通过js来取或者赋值的。这个你要具体问题,具体分析。。。建议通过模拟点击来操作,webdriver有相关方法 demo里的只是演示用法,不可能直接拿来就可以跑所有网站了。
----------------------------------------------
-
作者:
2018/4/28 16:32:55
24楼:
但在Delphi中用WebBrowser加载网易邮箱网页后就可以正确找到相应的网页元素并赋值和模拟点击操作。原以为这个Webdriver4D功能更强大、使用更简单,反倒还不如直接用WebBrowser操作来得简单。应该是我才疏学浅不会用
----------------------------------------------
-
作者:
2018/4/28 16:36:08
25楼:
@wac1104 方便时烦请指教上述问题,谢谢!
----------------------------------------------
-
作者:
bjlg (蓝天)
★☆☆☆☆
-
盒子活跃会员
2018/4/28 22:15:07
26楼:
@@wac1104 这个与自己用webbrowser开发进行处理。有什么太大的优点?
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
2018/4/29 21:09:35
27楼:
@bjlg 里面有无头浏览器Phantomjs 可以采用无界面方式访问。这样后台起服务抓数据都没问题。不用打开浏览器界面。
----------------------------------------------
火鸟
作者:
2018/4/29 21:11:02
28楼:
@ fgrcwp 必须用Xpath 或者 Element find 找到对应元素 然后传递sendkey 来赋值 可以用elementclick 来模拟点击。
----------------------------------------------
火鸟
作者:
2018/4/29 21:13:07
29楼:
另外还有个办法,ExecuteScript 可以直接调用js 脚本,可以参考一下,这个也可以获取元素。 点击 或者赋值。
----------------------------------------------
火鸟
作者:
2018/4/29 22:04:01
30楼:
@wac1104: 用xpath或ExecuteScript仍然找不到网页元素,不知道什么原因?求助! procedure TForm1.Button1Click(Sender: TObject); var Element: string; FWD: TPhantomjs; begin try FWD := TPhantomjs.Create(nil); FWD.Address := '127.0.0.1'; FWD.Port := 8080; FWD.StartDriver('WebDriver\Phantomjs.exe'); FWD.NewSession; FWD.Set_Window_Size(1366, 768); FWD.Implicitly_Wait(1500); FWD.GetURL('https://mail.163.com/& #39;); Sleep(1000); FWD.Implicitly_Wait(5000); Element := FWD.FindElementByXPath('//input[@name="email" and @data-type="email"]'); FWD.SendKey(Element, 'demo'); Element := FWD.FindElementByXPath('//input[@name="password" and @type="password"]'); FWD.SendKey(Element, 'demo'); Element := FWD.FindElementByID('dologin'); FWD.ElementClick(Element); Sleep(1000); FWD.Implicitly_Wait(5000); FWD.Save_screenshot('163.png'); finally FreeAndNil(FWD); end; end; 用xpath或ExecuteScript仍然找不到网页元素,不知道什么原因? '{"message":"{\"errorMessage\":\"Unable to find element with xpath ''//input[@name=\\\"email\\\" and @data-type=\\\"email\\\"]''\",\"request\":{\"headers\":{\"Accept\":\"*/*\",\"Connection\":\"Keep-Alive\",\"Content-Length\":\"77\",\"Content-Type\":\"application/json\",\"Host\":\"127.0.0.1:8080\",\"User-Agent\":\"Delphi http Client\"},\"httpVersion\":\"1.1\",\"method\":\"POST\",\"post\":\"{\\\"value\\\":\\\"//input[@name=\\\\\\\"email\\\\\\\" and @data-type=\\\\\\\"email\\\\\\\"]\\\",\\\"using\\\":\\\"xpath\\\"}\",\"url\":\"/element\",\"urlParsed\":{\"anchor\":\"\",\"query\":\"\",\"file\":\"element\",\"directory\":\"/\",\"path\":\"/element\",\"relative\":\"/element\",\"port\":\"\",\"host\":\"\",\"password\":\"\",\"user\":\"\",\"userInfo\":\"\",\"authority\":\"\",\"protocol\":\"\",\"source\":\"/element\",\"queryKey\":{},\"chunks\":[\"element\"]},\"urlOriginal\":\"/session/31e7ca60-4bb8-11e8-9dc4-074ca859e1c0/element\"}}","screen":"","class":"org.openqa.selenium.NoSuchElementException"}'
----------------------------------------------
-
作者:
2018/4/30 6:58:20
31楼:
我尝试了用pthon 也不行,可能网易为了防止爬虫类的东西批量注册邮箱做了限制。这个还得研究一下。
----------------------------------------------
火鸟
作者:
2018/4/30 8:08:05
33楼:
找到原因了你没切换到对应frame 采用如下方式。好久不写我也忘了…… 要切换一下frame @fgrcwp WD := TEdgeDriver.Create(nil); try WD.Address := 'localhost'; //WD.Port := 7777; WD.StartDriver('d:\webdriver\MicrosoftWebDriver.exe');//路径正确 WD.Path :=''; Sleep(500); WD.NewSession; WD.GetURL('https://mail.163.com& #39;); WD.SwitchToFrame('x-URS-iframe'); Sleep(3000); Element := WD.FindElementByXPath('//input[@name="email" and @class="j-inputtext dlemail"'); WD.SendKey(Element, 'demo'); Element := WD.FindElementByXPath('//input[@name="password" and @type="password"]'); WD.SendKey(Element, 'demo'); Element := WD.FindElementByID('dologin'); WD.ElementClick(Element); finally FreeAndNil(WD); end;
----------------------------------------------
火鸟
作者:
2018/4/30 9:12:02
34楼:
@wac1104: 我电脑是Win7没有Edge浏览器,我用TPhantomjs和TIEDriver测试,也加了SwitchToFrame('x-URS-iframe');但还是找不到网页元素,奇怪了!能麻烦你用TPhantomjs和TIEDriver测试一下给我一个正确的示例吗?非常感谢! procedure TForm1.Button1Click(Sender: TObject); var WD: TPhantomjs; Element: string; begin WD := TPhantomjs.Create(nil); try WD.Address := 'localhost'; //WD.Port := 7777; WD.StartDriver('WebDriver\phantomjs.exe');//路径正确 WD.Path :=''; Sleep(500); WD.NewSession; WD.GetURL('https://mail.163.com& #39;); WD.Set_Window_Size(1366, 768); WD.SwitchToFrame('x-URS-iframe'); Sleep(3000); //WD.Save_screenshot('163A.png'); Element := WD.FindElementByXPath('//input[@name="email" and @class="j-inputtext dlemail"'); WD.SendKey(Element, 'demo'); Element := WD.FindElementByXPath('//input[@name="password" and @type="password"]'); WD.SendKey(Element, 'demo'); Element := WD.FindElementByID('dologin'); WD.ElementClick(Element); //WD.Save_screenshot('163B.png'); finally FreeAndNil(WD); end; end;
----------------------------------------------
-
作者:
2018/4/30 12:47:58
35楼:
火鸟大哥,能帮我发mail一份吗,不知道为什么上不了 github了,我的邮箱 2980995505@qq.com,谢谢了
----------------------------------------------
-
作者:
2018/5/1 15:41:05
36楼:
知道原因了,我这个还得改一下FindElement 里面有个标准得W3C的标准格式,我还要改造一下程序符合这个标准。
----------------------------------------------
火鸟
作者:
2018/5/2 15:00:13
37楼:
@fgrcwp 目前已经测试通过,已经可以填写163邮箱了,是我的代码问题,适用性不够强,现在改造成类似python 的方式。做了W3C判断。晚些时候提交github
----------------------------------------------
火鸟
作者:
2018/5/2 16:17:04
38楼:
已经更新 https://github.com/Ericwang1104/WebDriver4D
----------------------------------------------
火鸟
作者:
bjlg (蓝天)
★☆☆☆☆
-
盒子活跃会员
2018/5/2 22:42:15
39楼:
@ wac1104 谢谢。
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
2018/5/2 23:50:25
40楼:
@wac1104: 我测试了你的例子中TestTIEDriver下面的TestMail163依然失败,测试过程中,当自动打开IE并打开163邮箱页面后就卡住不动了,最终超时出现以下错误: TestMail163: EJsonCastException at $0064F05F Cannot cast Object into String 测试TestPhantomjsDriver下面的TestMail163出现以下错误: TestMail163: EJsonParserException at $0064EC26 Expected "{" but found identifier (1, 10) 不知你是如何测试通过的?我的运行环境是Win7/32位IE11版本,Delphi10.2.3。 附ie_log文件内容: [INFO - 2018-05-02T16:00:26.472Z] GhostDriver - Main - running on port 8888 [INFO - 2018-05-02T16:00:26.895Z] Session [edfb0b20-4e21-11e8-a942-e132997279c3] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36","webSecurityEnabled":true} [INFO - 2018-05-02T16:00:26.908Z] Session [edfb0b20-4e21-11e8-a942-e132997279c3] - page.customHeaders: - {} [INFO - 2018-05-02T16:00:26.988Z] Session [edfb0b20-4e21-11e8-a942-e132997279c3] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.1.1","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"windows-7-32bit","javascriptEnabled":true,"takesScreenshot":false,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"},"phantomjs.page.settings.userAgent":"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36"} [INFO - 2018-05-02T16:00:27.004Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: edfb0b20-4e21-11e8-a942-e132997279c3 [ERROR - 2018-05-02T16:00:31.465Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1525276831398 [ERROR - 2018-05-02T16:00:31.610Z] RouterReqHand - _handle.error - {"line":264,"sourceURL":"phantomjs ://code/webelement_request_handler.js","stack":"_postValueCommand@phantomjs ://code/webelement_request_handler.js :264:52\n_handle@phantomjs ://code/webelement_request_handler.js :72:30\n_reroute@phantomjs ://code/request_handler.js :61:20\n_handle@phantomjs ://code/session_request_handler.js :120:42\n_reroute@phantomjs ://code/request_handler.js :61:20\n_handle@phantomjs ://code/router_request_handler.js :78:46"}
----------------------------------------------
-
作者:
bjlg (蓝天)
★☆☆☆☆
-
盒子活跃会员
2018/5/3 11:56:54
41楼:
'TypeError - undefined is not a constructor (evaluating ''_getTagName(currWindow).toLowerCase()'')'
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
2018/5/3 12:56:56
42楼:
@fgrcwp 我测试的是IE phantomjs 和 W3C标准不太一样,还没做完兼容性。
----------------------------------------------
火鸟
作者:
2018/5/3 12:57:29
43楼:
@bjlg 哪个测试出错了?
----------------------------------------------
火鸟
作者:
2018/5/3 13:14:59
44楼:
@wac1104: 我测试了你的例子中TestTIEDriver下面的TestMail163依然失败,测试过程中,当自动打开IE并打开163邮箱页面后就卡住不动了,最终超时出现以下错误: TestMail163: EJsonCastException at $0064F05F Cannot cast Object into String 我连IE测试都不成功!
----------------------------------------------
-
作者:
2018/5/3 14:49:51
45楼:
我更新了,你再试试 我运行IEtest163 都是正确的。
----------------------------------------------
火鸟
作者:
2018/5/3 14:52:26
46楼:
我建立个讨论群,回头又有bug什么的都进这里讨论吧,我也是希望借助开源让这部分代码更健壮,我自己写的东西也就更健壮 群号:531448960 (webdriver4D 讨论群)
----------------------------------------------
火鸟
作者:
bjlg (蓝天)
★☆☆☆☆
-
盒子活跃会员
2018/5/3 16:23:09
47楼:
@wac1104: 出错信息有几个地方 同时建议一下,你把各个目录放统一一点
此帖子包含附件: 大小: 84.0K
----------------------------------------------
http://delphi.icm.edu.pl/ftp/http://delphi-z.ru