phantomjs经典报错phantomjs://platform/console++.js:263

[软件开发] 季雨林 2018/6/2 13:21:06

        一直以为是自己操作不当,然而事实证明,需要给他足够时间让浏览器加载。

        因此在 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 文章的更新编辑依此链接为准。欢迎关注源站原创文章!


鲁ICP备14008001号-2