2015-10-19 54 views
0

我使用Java和硒編寫測試,我用下面的代碼獲得了Chrome:設置經歷的Chrome://設置硒

driverChrome.manage().window().maximize(); 
driverChrome.get("chrome://settings"); 

但是,當頁面打開我不能發現它的任何網頁元素,例如,當我試圖找到「顯示高級設置......」這段代碼

driverChrome.findElement(By.xpath("//a[@id='advanced-settings-expander']")).click(); 

它拋出一個錯誤,說「沒有這樣的元素:無法找到元素」 我試圖找到其他元素,但都失敗了。我在這裏看到this,但它沒有幫助。

找到下面的代碼:

driverChrome.manage().window().maximize(); 
    driverChrome.get("chrome://settings"); 
    Thread.sleep(5000); 
    WebElement w = driverChrome.findElement(By 
      .xpath("//iframe[@name='settings']"));  
    driverChrome = driverChrome.switchTo().frame(w); 
    Thread.sleep(1000); 
    while (true) { 
     try { 
      WebElement we = w.findElement(By 
        .xpath("//a[text()='Show advanced settings...']"));    
      if (we.isDisplayed()) { 
       we.click(); 
       Thread.sleep(1000); 
       break; 
      } 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
      System.out.println("========================="); 
     } 
    } 
+0

您試圖修改哪些設置?而不是打開設置頁面。使用['ChromeOptions'](https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/chrome/ChromeOptions.html)修改任何設置。 – JRodDynamite

+0

@JRodDynamite你已經幫助我[在這裏](http://stackoverflow.com/questions/33218794/enabling-popup-windows-by-selenium):)但在你的幫助之前,我試圖通過Chrome做到這一點:設置,並找出我無法找到任何網頁元素,所以出於好奇,我想知道爲什麼我不能從那裏得到ay元素 – LoveLovelyJava

+1

切換到iframe,然後嘗試點擊。 – Turcia

回答

1

我沒有測試過這一點,但我把你的代碼段,並清理了一下。試試這個,看看它是否有效。這應該非常接近。

切換到IFRAME上下文後,不需要像w.findElement()那樣引用IFRAME

一般來說,Thread.sleep()不是一個好的做法。您應該使用WebDriverWait並使用ExpectedConditions。查看文檔以瞭解您可以等待使用ExpectedConditions的所有不同內容。我在下面的代碼中使用了.elementToBeClickable()。這是完美的,因爲你想點擊一個元素。 .until()返回等待的元素,因此您可以在語句的末尾添加.click() ...或者您可以將該元素存儲在WebElement變量中並在其他地方使用。

driverChrome.manage().window().maximize(); 
driverChrome.get("chrome://settings"); 
WebElement w = driverChrome.findElement(By.xpath("//iframe[@name='settings']")); 
driverChrome = driverChrome.switchTo().frame(w); 

WebDriverWait wait = new WebDriverWait(driverChrome, 10); 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Show advanced settings...']"))).click(); 

// alternative example... store returned element and then click on a separate line... or use the variable elsewhere, etc. 
// WebElement link = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='Show advanced settings...']"))); 
// link.click(); 
+0

感謝的確,只是一個問題,爲什麼** w.findElement(bla bla)**拋出錯誤? – LoveLovelyJava

+0

這不是我已經探索的,但如果我猜測,我會說,Selenium實現對IFRAME的訪問的方式是通過上下文...您使用'.switchTo()'導航到'IFRAME'所以'w.findElement()'沒有意義。當你處於默認的上下文中時,你看不到'w'裏面的元素。當你在'w'的背景下時,你看不到'w'。 – JeffC