首页 文章

无头浏览器C#和替代品

提问于
浏览
0

目前我在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

    对于你的第一个问题,你应该考虑使用 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 .

相关问题