Selenium - PhantomJS - DOM遍历中的Findelements很慢

时间:2017-08-10 16:44:58

标签: c# selenium phantomjs

因为原因,我正试图通过使用Selenium / PhantomJS来解析DOM。 它工作但它很慢,我不知道为什么。 Findelements每次似乎需要大约250ms。

我已经尝试将隐含等待归零并没有太大成功。我也试过使用Xpath而没有真正的改变。

这是代码,有什么建议吗?

    public static void RecurseDomFromTop()
    {
        DomRecursor( pjsDriver.FindElement( By.TagName( "*" ) ) );
    }

    public static void DomRecursor( IWebElement node )
    {
        ReadOnlyCollection<IWebElement> iwes = node.FindElements( By.TagName( "*" ) );

        foreach (IWebElement iwe in iwes)
        {
           DomRecursor( iwe );
        }

    }

1 个答案:

答案 0 :(得分:1)

你用这种方式比较两个dom的方法是错误的。每次发出Selenium请求时,都会创建一个发送给驱动程序的HTTP请求,驱动程序将其发送到浏览器,然后浏览器将其发送回驱动程序和驱动程序,返回给您语言绑定。这涉及很多开销。

相反,您应该使用let contact = CNMutableContact() contact.namePrefix = data["firstName"] as! String contact.nameSuffix = data["lastName"] as! String contact.organizationName = data["company"] as! String contact.jobTitle = data["jobTitle"] as! String let address = CNMutablePostalAddress() address.street = data["street"] as! String address.city = data["city"] as! String address.state = data["state"] as! String address.postalCode = data["zipcode"] as! String address.country = data["country"] as! String let labeledAddress = CNLabeledValue<CNPostalAddress>(label: CNLabelHome, value: address) //<- You can create other `CNLabeledValue<CNPostalAddress>`s with other `CNLabelXxxx`s or your custom label. contact.postalAddresses = [labeledAddress] 并在一次调用中获取整个HTML响应。之后您可以使用HTML解析库,它比您现在采用的方法快至少10倍。

请看下面使用HtmlAgilityPack获取DOM数据的文章

https://www.codeproject.com/Articles/659019/Scraping-HTML-DOM-elements-using-HtmlAgilityPack-H