一直以为是自己操作不当,然而事实证明,需要给他足够时间让浏览器加载。
因此在 driver1.FindElementById("ID")的时候,总是报错提示phantomjs://platform/console++.js:263
仔细一想,太正常了,程序执行速度很快,对于我爬取的网站,使用了AngularJS绑定数据进行加载,需要多等等才能出现我要获取的“ID”控件。因此,最后解决办法很简单,套用一个循环,失败就重试,反复等待不报错。
bool again = true;
do
{
try
{
again = false;
Thread.Sleep(1000);
driver1.FindElementById("ID").SendKeys("123");//这里容易报错
}
catch (Exception)
{
again = true;
}
}while(again);
个人理解,这个报错是phantomjs设计的不够合理:FindElementById("ID")方法寻找不到应该返回null,而不应该throw异常
------------------------------
20180602补充:
在计算机行业里,永远有考虑不周的地方,发布这个博文才几天,就发现了死循环出现(原因:采集的网页没有返回特定内容)
修改后的代码如下:
int retry = 20;//失败的话,最多循环多少次
int i = 1;//计数用,第一次,所以1开头
bool again = false;//配合计数,是否继续循环
do
{
try
{
again = false;
//配合计数,需要预估下正常情况多少秒之内可以成功。
//这个500毫秒乘以总次数要求大于预计成功的时间
Thread.Sleep(500);
driver1.FindElementById("ID").SendKeys("123");//这里容易报错
}
catch (Exception)
{
again = true;
i++;
if (i >= retry)
again = false;
//截图看下错误样子
driver1.GetScreenshot().SaveAsFile(string.Format(path, DateTime.Now.ToString("yyyyMMdd HHmmssfff.A")), ScreenshotImageFormat.Png);
}
}while(again);
原文地址:
https://www.opengps.cn/Blog/View.aspx?id=103
文章的更新编辑依此链接为准。欢迎关注源站原创文章!