我正在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
}
最佳答案
减少代码的一种好方法是确定方法中的职责,例如:
然后,根据目的对代码进行模块化:
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);
}
}
如果您要执行以下操作,此方法还可以最大程度地减少代码更改:
-更改元素的隐藏方式,或
-隐藏其他类别下的元素