Selenium测试 - 单击以展开jstree节点

时间:2017-05-25 12:41:12

标签: selenium junit jstree

我正在尝试使用jstree为带有jsp页面的Java应用程序编写一些selenium测试。虽然我有很多基本测试要遵循,但我没有做太多。

本质上,id是自动生成的,因此我使用xpath来定位特定的兴趣点。在页面上,我希望选择的叶子是隐藏的(因此无法进行测试)。因此,我的单元测试中的第一个任务是扩展特定链接,因此子节点被渲染并可用于我的实际测试。似乎是关键的元素是i标签。

为清晰起见编辑

如果你看一下https://www.jstree.com/demo/我本质上是想在java selenium测试中到达LED下的Building节点(所以如果你在打开页面时查看源代码,那么就没有对Building的引用,但是当你打开LED节点时,会呈现html)。我希望这有道理吗?!

 <li role="treeitem" aria-selected="false" aria-level="2" aria-labelledby="M[randomnumber]_anchor" aria-expanded="false" id=" M[randomnumber]" class="jstree-node treeNodeTextParentLevel3 jstree-closed">    
  <i class="jstree-icon jstree-ocl" role="presentation"></i>
    <a class="jstree-anchor" href="#" tabindex="-1" id=" M[randomnumber]_anchor ">
      <i class="jstree-icon jstree-checkbox" role="presentation"></i>
      <i class="jstree-icon jstree-themeicon" role="presentation"></i>
     Visible leaf text</a>
  </li>

使用Chrome开发者工具告诉我

<i class="jstree-icon jstree-ocl" role="presentation"></i>

是您需要单击以展开子节点的元素。

这设置

aria-expanded="true" 

class="jstree-node jstree-open"

所以我使用了两种方法

1)如果我尝试

 driverWait.until(ExpectedConditions.elementToBeClickable(
          By.xpath("//aside/div/div/ul/li[@id=’knownId] ']/ul/li[contains(@id,'M')]/i"))).click();

我收到错误

Element <i class="jstree-icon jstree-ocl" role="presentation"></i> is
> not clickable at point

对于i标签,这似乎是公平的?

2)所以我尝试通过改变属性

直接做到这一点
WebElement element = driver.findElement(By.xpath("//aside/div/div/ul/li[@id=’knownId']/ul/li[contains(@id,'M')]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].setAttribute('aria-expanded',arguments[1]);", element, "true");
js.executeScript("arguments[0].setAttribute('class',arguments[1]);", element, "jstree-node jstree-open");

但是在这种情况下,树叶不会展开(尽管如果我做了element.getAttribute(“aria-expanded”);之后例如属性已经更新,它似乎在被测试的页面上什么都不做)和所以我无法选择我想要测试的子项目。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

我在给定的网站上尝试了相同的

此处JavascriptExecutor正在点击元素

我试过下面的代码:

// tree menu present under iframe so need to switch into iframe first
driver.switchTo().frame(0);

// used to click on expand option of LED
WebElement element = driver.findElement(By.xpath(".//*[@id='LED']/i"));
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].click();",element);


 System.out.println(driver.findElement(By.id("LED/Building_anchor")).getText());

如果您想点击LED&gt;下的Test,可以使用其他示例。构建&gt;测试

然后你可以试试

JavascriptExecutor js = (JavascriptExecutor) driver;

// To click on expand menu of LED
js.executeScript("arguments[0].click();",driver.findElement(By.xpath(".//*[@id='LED']/i")));

// To click on expand menu of Building     
js.executeScript("arguments[0].click();",driver.findElement(By.xpath(".//*[@id='LED/Building']/i")));

// To click on TestFile under building      
js.executeScript("arguments[0].click();",driver.findElement(By.id("LED/Building/Test_anchor")));

您可以在应用程序中尝试这样做。如果有任何事情请告诉我