无头浏览器C#和替代品

时间:2017-04-04 14:50:05

标签: c# selenium cookies xmlhttprequest phantomjs

目前我在c#中使用了selenium和phantomjs以下代码:

public class Driver
{
    static void Main()
    {
        using (var driver = new PhantomJSDriver())
        {
            driver.Navigate().GoToUrl("https://www.website.com/");
            driver.Navigate().GoToUrl("https://www.website.com/productpage/");
            driver.ExecuteScript("document.getElementById('pdp_selectedSize').value = '10.0'");  //FindElementById("pdp_selectedSize").SendKeys("10.0");
            driver.ExecuteScript("document.getElementById('product_form').submit()");
            driver.Navigate().GoToUrl("http://www.website/cart/");
            Screenshot sh = driver.GetScreenshot();
            sh.SaveAsFile(@"C:\temp\test.jpg", ImageFormat.Png);
        }
    }
}

我的目标是能够将产品添加到购物车中,然后自动结帐。仅包含屏幕截图以测试代码是否成功运行。我的第一个问题是我经常遇到一个错误,它无法找到产品ID为“pdp_selectedSize”的元素。我假设这是因为webdriver还没有加载页面,所以我正在寻找一种方法来继续检查,直到找到它而不必设置特定的超时。

我也在寻找更快的替代品而不是无头浏览器。我使用无头浏览器而不是http请求,因为我需要某些cookie才能在页面上签出,这些cookie是通过页面内的javascript设置的。如果有人对更快的方法进行推荐,我们将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题,您应该考虑使用ExpectedConditions' which is part of the WebDriverWait class in Selenium`。以下代码示例取自此处,仅作为参考点。

using (IWebDriver driver = new FirefoxDriver())
{
   driver.Url = "http://somedomain/url_that_delays_loading";
   WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
   IWebElement myDynamicElement = wait.Until<IWebElement>(d =>
   d.FindElement(By.Id("someDynamicElement")));
}

有关WebDriverWaits here的更多信息。

至于你的第二个问题,在我看来,这是一个非常主观的问题。无头浏览器不一定比真正的浏览器更快或更慢。请参阅此article