2016-05-16 21 views
3

我正在我的Java Selenium測試套件中運行一個隱藏網頁動態元素(如基於位置的電話號碼)的方法,所以當我稍後進行截圖比較時 - 因爲這些,它不會失敗。如何減少要隱藏的元素列表中的重複代碼(Java/webDriver)

我試圖減少這種方法中代碼的重複部分。我使用的findElements每次都會返回一個元素的所有實例,所以然後我通過每個元素循環來隱藏它。然而,我每次都調用相同的JavaScript命令 - 所以我想也許有辦法做到這一點更整潔 - 但我很努力這樣做。改變的位是元素的變量名稱和通過Selenium找到它的方法。希望這是有道理的!

我的代碼是:

private void hideDynamicElements() throws IOException, InterruptedException { 

    List<WebElement> dynamicTelephoneNumbers = driver.findElements(By.className("telephone-number")); 
    for (WebElement hideElement : dynamicTelephoneNumbers){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    List<WebElement> dynamicChatWindow = driver.findElements(By.cssSelector("#chatContainer")); 
    for (WebElement hideElement : dynamicChatWindow){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    List<WebElement> dynamicDemoChat = driver.findElements(By.cssSelector("#demoFormChat")); 
    for (WebElement hideElement : dynamicDemoChat){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    List<WebElement> dynamicDemoChatCTA = driver.findElements(By.className("reach-out")); 
    for (WebElement hideElement : dynamicDemoChatCTA){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    List<WebElement> dynamicBlogHeader = driver.findElements(By.cssSelector("div.cf.article-header")); 
    for (WebElement hideElement : dynamicBlogHeader){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    List<WebElement> dynamicBlogFeed = driver.findElements(By.className("js-blog-feed-container")); 
    for (WebElement hideElement : dynamicBlogFeed){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

    TimeUnit.SECONDS.sleep(1); //Wait to be sure all elements have disappeared in the browser 
} 

回答

1

一個很好的方式,以減少代碼的識別方法的責任,如:

  • 尋找資源以隱藏(通過類

    01:名稱或CSS選擇)
  • 隱藏針對性資源

然後,根據其目的模塊化的代碼

private void hideDynamicElements() throws IOException, InterruptedException { 
    List<By> criteria = Arrays.asList(
     By.className("telephone-number"), 
     By.cssSelector("#chatContainer"), 
     By.cssSelector("#demoFormChat"), 
     By.className("reach-out"), 
     By.cssSelector("div.cf.article-header"), 
     By.className("js-blog-feed-container") 
    ); 

    for(By crit : criteria) { 
     List<WebElement> elements = driver.findElements(crit); 

     hideElements(elements); 
    } 
} 

private void hideElements(List<WebElement> elements) { 
    for (WebElement hideElement : elements){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 
} 

這種方法也最大限度地減少的情況下,代碼的變化要: - 改變元素是如何隱藏,或 - 隱藏元素在其他類

+0

這真是很好的建議,謝謝! –

2

創建功能,如: -

void visiblity(String Classname, Element hideElement) 
    { 
     List<WebElement> dynamicBlogFeed = driver.findElements(By.className(Classname)); 
     for (WebElement hideElement : dynamicBlogFeed){ 
     ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
    } 

調用此溫控功能一次又一次,每當你需要它。

希望它會幫助你:)

0

首先初始化一個ArrayList如下:

 ArrayList<By> dynamicElements = new ArrayList<By>(Arrays.asList((By.className("telephone-number"), By.cssSelector("#demoFormChat"),...,)) 

然後通過外循環的循環dynamicElements;在內部循環中,您將執行您的實際任務。

for(By element: dynamicElements){ 
     ArrayList<WebElement> dynamicWebElements = driver.findElements(element); 
     for (WebElement hideElement : dynamicWebElements){ 
      ((JavascriptExecutor) driver).executeScript("arguments[0].style.visibility='hidden'", hideElement); 
     } 
    } 

希望它會有所幫助。

+1

十分感謝!這就是我試圖達到的目標! –

+0

歡迎您! :) –

0

我會用一個CSS選擇器獲取所有目標元素,並用一次JavaScript調用隱藏它們。這將是更容易維護和更快:

private void hideDynamicElements() throws IOException, InterruptedException { 
    String selectors = ".telephone-number, #chatContainer, #demoFormChat, .reach-out, div.cf.article-header, .js-blog-feed-container"; 

    String JS_HIDE_CSS_SELECTORS = 
     "var hide = function(element){ element.style.visibility = 'hidden' }; " + 
     "var elements = document.querySelectorAll(arguments[0]);    " + 
     "Array.prototype.forEach.call(elements, hide);      " ; 

    ((JavascriptExecutor)driver).executeScript(JS_HIDE_CSS_SELECTORS, selectors); 

    TimeUnit.SECONDS.sleep(1); //Wait to be sure all elements have disappeared in the browser 
} 
+0

嘿謝謝!好主意。將看看爲所有人使用CSS選擇器。 –