2017-04-06 62 views
3

我正在測試客戶端網站的數據流。它的廣告花費的時間比我想用Selenium命令測試的每個頁面的數據元素要長得多。Selenium ChromeDriver C#如何在加載之前導航頁面?

我無法控制廣告,也無法使其無聲無息。

我想在完整頁面加載之前點擊瀏覽每個頁面。我知道這是可能的,因爲我可以使用鼠標手動完成。然而,儘管我嘗試過,頑固的chromeDriver在整個頁面加載之前都不會開始自動化。

我使用的是C#.Net 4.6.1,chrome32_55.0.2883.75和Selenium版本3.0.1.0。

此外,我使用推薦的Selenium頁面對象模型。我實現WaitForLoad()這樣的:

public override void WaitForLoad() 
    { 
     _isLoaded = Wait.Until(d => 
     { 
      lock (d) 
      { 
       SwitchToSelf(); 

       return PageRegex.IsMatch(Session.Driver.PageSource);      
      } 
     }); 
    } 

的PageRegex上述工作,但整個頁面加載之後。這令人沮喪,因爲我可以直觀地看到PageRegex旨在解析的文本字符串在屏幕上。這導致我相信其他地方有一個設置,也許在我配置ChromeDriver的時候,這會讓我在完全加載之前解析Session.Driver.PageSource。

這是怎麼了實例化的ChromeDriver:

  var options = new ChromeOptions(); 

      options.AddArguments("test-type"); 


      options.AddArgument("incognito"); // works 
      options.AddArgument("--disable-bundled-ppapi-flash"); // works! this turns off shockwave 
      options.AddArgument("--disable-extensions"); // works 
      options.AddArguments("--start-fullscreen"); 

      string workFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + 
               "\\SHARED"; 

      options.BinaryLocation = workFolder + @"\Chrome32\chrome32_55.0.2883.75\chrome.exe"; 
      var driver = new ChromeDriver(options); 
      driver.Manage().Cookies.DeleteAllCookies(); 
      return driver; 

回答

3

要它已經完成加載之前與網頁互動,您可以降低超時和捕獲異常:

IWebDriver driver = new ChromeDriver(); 
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 

driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMilliseconds(500)); 

try { 
    driver.Navigate().GoToUrl("http://www.deelay.me/5000/http://www.deelay.me/"); 
} catch (OpenQA.Selenium.WebDriverTimeoutException) { } 

// waits for an element 
var body = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("body"))); 

或者您也可以通過頁面加載stategy設置爲none禁用等待:

var options = new ChromeOptions(); 
options.AddAdditionalCapability("pageLoadStrategy", "none", true); 

IWebDriver driver = new ChromeDriver(options); 
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 

driver.Navigate().GoToUrl("http://www.deelay.me/5000/http://www.deelay.me/"); 

// waits for an element 
var body = wait.Until(ExpectedConditions.ElementExists(By.CssSelector("body"))); 
+0

這第二個選項非常完美 – sapbucket

1

您是否嘗試過與ExpectedConditions類的ElementToBeClickable或VisibilityOfElementLocated方法。我認爲它應該適用於你提到的場景。

WebDriverWait wdw = new WebDriverWait(driver, TimeSpan.FromSeconds(120)); 
      wdw.Until(ExpectedConditions.ElementToBeClickable(By.Id("ElementId"))); 
相關問題