2017-04-04 108 views
0

目前我使用硒和phantomjs在C#中有下面的代码:模拟浏览器C#和替代

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设置的。如果有人推荐更快的方法,将不胜感激,谢谢!

+0

查看[Selenium参考资料](http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp)中的'ExpectedConditions'。 – Brian

+0

是WebDriverWait的一部分吗? – JBoy

+0

它与'WebDriverWait'结合使用,是的。 – Brian

回答

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"))); 
} 

更多关于WebDriverWaitshere

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

+0

有没有什么与WebRequest类一起处理JavaScript? – JBoy

+0

我不是100%确定的。 'Selenium'虽然有一个'JSExecutor'类。 – Brian