DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: hekai_dut
今日帖子: 0
在线用户: 3
导航: 论坛 -> 网络通讯 斑竹:liumazi,sephil  
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/27 13:40:51
标题:
鄙人写的开源WebDriver4D 浏览:1933
加入我的收藏
楼主: https://github.com/Ericwang1104/WebDriver4D
可用于 爬虫及web 测试。 目前封装了ie firefox chrome  edge 以及Phantomjs 无头浏览器的访问。
----------------------------------------------
火鸟
作者:
男 s421600 (shen) ▲▲▲△△ -
注册会员
2018/4/27 13:47:19
1楼: 不知道是是干啥用的,谁给科普一下
----------------------------------------------
-
作者:
男 keymark (keymark) ▲△△△△ -
注册会员
2018/4/27 14:07:44
2楼: 为啥不去参战 三层
搞这么个玩意..干啥的?.......
----------------------------------------------
m3u8播放器:DPlayer/hlsjs-p2p-engine/ckplayer/flashls-dev/sewise-player/http不能播https某些情况下dns服务:coredns/http服务:miniweb/
作者:
男 bdl1 (bdl1) ▲▲▲△△ -
注册会员
2018/4/27 14:49:48
3楼: 支持一下,虽然不知怎么用。
----------------------------------------------
-我的新浪博客
作者:
男 shinyv (辛雨) ★☆☆☆☆ -
盒子活跃会员
2018/4/27 15:42:01
4楼: 三层是不可能三层的,这辈子都不可能三层。代码又不太会写,就是搜索剪贴复制这种东西,才能维持得了生活的样子。泡论坛像是回家一样,灌起水来比编程感觉好多了!盒子里面个个都是人才,说话又好听,吵架都和外面不一样,我超喜欢盒子的!
----------------------------------------------
-
作者:
男 bahamut8348 (leonna) ▲▲▲▲▲ -
普通会员
2018/4/27 15:47:22
5楼: 不去参战中间件,跑这搞这个干啥?
人生短短几十年,该折腾的时候就一定要抓紧时间折腾。
----------------------------------------------
--
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/27 16:17:54
6楼: 这个东西可用于 爬取数据 ,python 里面有个WEbdriver  大家主要用它取爬取数据,可以完整模拟浏览器操作,另外也可用于web 填充测试  也可以用于制作表单填充工具。
----------------------------------------------
火鸟
作者:
男 mlskin (mlskin) ▲▲△△△ -
注册会员
2018/4/27 17:37:35
7楼: 试了一下,好东西呀~~ 但低版本的Delphi使用起来有些麻烦,要改动一些代码,WD_httpDelphi.pas 里面的HTTPClient对象建议默认使用indy的版本,要不然低版本的Delphi无法使用 按此在新窗口浏览图片
----------------------------------------------
Delphi MlSkin 它能让你的程序拥有像QQ一样多彩炫丽的外观http://www.pngui.com
作者:
男 wang_80919 (Flying Wang) ▲▲▲▲△ -
普通会员
2018/4/27 19:20:48
8楼: 为什么要兼容低版本。
低版本问题太多。不推荐用。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 cgs3300 (^_^) ★☆☆☆☆ -
盒子活跃会员
2018/4/27 19:32:30
10楼: 这个不错,支持一下。
----------------------------------------------
-
作者:
男 nihaongy (nihao) ▲▲▲▲▲ -
普通会员
2018/4/27 21:36:15
11楼: shinyv (辛雨)  哈哈,人才,
  三层是不可能三层的,这辈子都不可能三层。代码又不太会写,就是搜索剪贴复制这种东西,才能维持得了生活的样子。泡论坛像是回家一样,灌起水来比编程感觉好多了!盒子里面个个都是人才,说话又好听,吵架都和外面不一样,我超喜欢盒子的!
----------------------------------------------
-相互学习,共同进步! 努力每一天,不能望山跑死马
发上等愿,结中等缘,享下等福;择高处立,寻平处住,向宽处行
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 12:01:55
12楼: 这个如何判断网页已经加载完毕?通过延时好像不能准确知道是否加载完毕。
----------------------------------------------
-
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/28 12:31:08
13楼: @Fgrcwp  
能通过判断completed 状态来 判断,不过我在GEtURL 已经做了这个操作了。只有加载完成才会返回。
----------------------------------------------
火鸟
作者:
男 go_on (go_on) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 12:42:43
14楼: 好东西,mark一下,如果做爬虫是可以用上的,感谢楼主开源
----------------------------------------------
www.eudn.net工程师联合开发网
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 13:20:36
15楼: @wac1104 
那登录跳转后的页面如何判断已经加载完成呢?应该在哪里判断?
----------------------------------------------
-
作者:
男 edwinyeah (Edwin) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 14:52:24
16楼: 很棒!可惜我的低版本Delphi不支持。当时仍然很棒!
----------------------------------------------
-
作者:
男 crystalmoon (黑夜杀手) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 14:56:52
16楼: 支持数据达人。
东西不错的。

加载这一个,其实很简单的,隐式等待,并通过xpath,css selector 来判断目标是否成功加载了。
----------------------------------------------
-
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
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');
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没有错,不知何解?用微博测试相同方法却可以正确找到网页元素。
----------------------------------------------
-
作者:
男 mlskin (mlskin) ▲▲△△△ -
注册会员
2018/4/28 15:46:22
18楼: 可能是元素没有加载过来,应该在前面判断一下此元素是否已经加载再去操作; py 里面可以用WebDriverWait,这就需要作者实现一个类似的方法了
----------------------------------------------
Delphi MlSkin 它能让你的程序拥有像QQ一样多彩炫丽的外观http://www.pngui.com
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 15:55:55
19楼: 我甚至加了延时8秒10秒后再取都取不到,而网页正常打开都不超过3秒,我觉得不应该是还没加载完的原因。
----------------------------------------------
-
作者:
男 keymark (keymark) ▲△△△△ -
注册会员
2018/4/28 16:02:13
20楼: 爬虫不能自给跑js基本就是 爬静态数据咯. (没看WebDriver4D).还用不到
----------------------------------------------
m3u8播放器:DPlayer/hlsjs-p2p-engine/ckplayer/flashls-dev/sewise-player/http不能播https某些情况下dns服务:coredns/http服务:miniweb/
作者:
男 crystalmoon (黑夜杀手) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 16:17:43
21楼: 我觉得你应该先在python之类的里测试你的代码逻辑是否有问题。然后再转到Delphi,这样就可以确实是 Webdriver4D的问题还是 你代码本身的问题了。

另外,有些网页有反爬机制,很多text,submit之类的,不能直接通过js来取或者赋值的。
----------------------------------------------
-
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 16:20:18
22楼: @crystalmoon
我是想测试一下看看Webdriver4D是否可用于满足我的需要,如果测试没有问题才考虑转Delphi。方法完全是借鉴Webdriver4D里面的例子,只是换了一个测试网站而已。
----------------------------------------------
-
作者:
男 crystalmoon (黑夜杀手) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 16:23:27
23楼: 注意:Webdriver4D只是D下的一个 WebDriver 实现

还是这句话,有些网页有反爬机制,很多text,submit之类的,不能直接通过js来取或者赋值的。这个你要具体问题,具体分析。。。建议通过模拟点击来操作,webdriver有相关方法

demo里的只是演示用法,不可能直接拿来就可以跑所有网站了。
----------------------------------------------
-
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 16:32:55
24楼: 但在Delphi中用WebBrowser加载网易邮箱网页后就可以正确找到相应的网页元素并赋值和模拟点击操作。原以为这个Webdriver4D功能更强大、使用更简单,反倒还不如直接用WebBrowser操作来得简单。应该是我才疏学浅不会用
----------------------------------------------
-
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 16:36:08
25楼: @wac1104
方便时烦请指教上述问题,谢谢!
----------------------------------------------
-
作者:
男 bjlg (蓝天) ★☆☆☆☆ -
盒子活跃会员
2018/4/28 22:15:07
26楼: @@wac1104
这个与自己用webbrowser开发进行处理。有什么太大的优点?
----------------------------------------------
http://delphi-z.ru>http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/29 21:09:35
27楼: @bjlg 里面有无头浏览器Phantomjs 可以采用无界面方式访问。这样后台起服务抓数据都没问题。不用打开浏览器界面。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/29 21:11:02
28楼: @ fgrcwp 
必须用Xpath  或者 Element find 找到对应元素 然后传递sendkey 来赋值
可以用elementclick 来模拟点击。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/29 21:13:07
29楼: 另外还有个办法,ExecuteScript  可以直接调用js 脚本,可以参考一下,这个也可以获取元素。 点击 或者赋值。
----------------------------------------------
火鸟
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
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/');
    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"}'
----------------------------------------------
-
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/4/30 6:58:20
31楼: 我尝试了用pthon 也不行,可能网易为了防止爬虫类的东西批量注册邮箱做了限制。这个还得研究一下。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
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');
    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;
----------------------------------------------
火鸟
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
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');
    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;
----------------------------------------------
-
作者:
男 8111098 (8111098) ★☆☆☆☆ -
盒子活跃会员
2018/4/30 12:47:58
35楼: 火鸟大哥,能帮我发mail一份吗,不知道为什么上不了 github了,我的邮箱 2980995505@qq.com,谢谢了
----------------------------------------------
-
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/1 15:41:05
36楼: 知道原因了,我这个还得改一下FindElement  里面有个标准得W3C的标准格式,我还要改造一下程序符合这个标准。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/2 15:00:13
37楼: @fgrcwp 
目前已经测试通过,已经可以填写163邮箱了,是我的代码问题,适用性不够强,现在改造成类似python 的方式。做了W3C判断。晚些时候提交github
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/2 16:17:04
38楼: 已经更新

https://github.com/Ericwang1104/WebDriver4D
----------------------------------------------
火鸟
作者:
男 bjlg (蓝天) ★☆☆☆☆ -
盒子活跃会员
2018/5/2 22:42:15
39楼: @ wac1104 
谢谢。
----------------------------------------------
http://delphi-z.ru>http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
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-z.ru>http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/3 12:56:56
42楼: @fgrcwp 
我测试的是IE  phantomjs 和 W3C标准不太一样,还没做完兼容性。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/3 12:57:29
43楼: @bjlg 哪个测试出错了?
----------------------------------------------
火鸟
作者:
男 fgrcwp (风之语) ★☆☆☆☆ -
盒子活跃会员
2018/5/3 13:14:59
44楼: @wac1104:

我测试了你的例子中TestTIEDriver下面的TestMail163依然失败,测试过程中,当自动打开IE并打开163邮箱页面后就卡住不动了,最终超时出现以下错误:

TestMail163: EJsonCastException
at  $0064F05F
Cannot cast Object into String

我连IE测试都不成功!
----------------------------------------------
-
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/3 14:49:51
45楼: 我更新了,你再试试 我运行IEtest163 都是正确的。
----------------------------------------------
火鸟
作者:
男 wac1104 (火鸟) ★☆☆☆☆ -
注册会员
2018/5/3 14:52:26
46楼: 我建立个讨论群,回头又有bug什么的都进这里讨论吧,我也是希望借助开源让这部分代码更健壮,我自己写的东西也就更健壮
群号:531448960 (webdriver4D 讨论群)
----------------------------------------------
火鸟
作者:
男 bjlg (蓝天) ★☆☆☆☆ -
盒子活跃会员
2018/5/3 16:23:09
47楼: @wac1104: 出错信息有几个地方

同时建议一下,你把各个目录放统一一点
此帖子包含附件:
JPEG 图像
大小:84.0K
----------------------------------------------
http://delphi-z.ru>http://delphi.icm.edu.pl/ftp/http://delphi-z.ru
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v2.1 版权所有 页面执行45.89844毫秒 RSS