我正在Java Selenium测试套件中运行一种方法,该方法可隐藏网页中的动态元素(例如基于位置的电话号码),以便以后进行屏幕快照比较时,不会因为这些原因而失败。

我正在尝试减少此方法中重复的代码部分。我正在使用findElements,它每次都返回一个元素的所有实例,因此我通过每个对象进行“for循环”以将其隐藏。但是,我每次都调用相同的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
}

最佳答案

减少代码的一种好方法是确定方法中的职责,例如:

  • 查找要隐藏的资源(通过类名或通过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);
        }
    }
    

    如果您要执行以下操作,此方法还可以最大程度地减少代码更改:
    -更改元素的隐藏方式,或
    -隐藏其他类别下的元素

    10-08 09:42
    查看更多