Selenium 测试 - 单击以展开一个 jstree 节点
Selenium testing - click to expand a jstree node
我正在尝试使用 jstree 为带有 jsp 页面的 java 应用程序编写一些 selenium 测试。虽然我有相当多的基本测试要遵循,但我并没有做太多这方面的工作。
本质上,id 是自动生成的,所以我使用 xpath 来定位特定的兴趣点。在页面上,我希望 select 的叶子被隐藏了(因此无法用于测试)。因此,我的单元测试中的第一个任务是展开一个特定的 link,因此子节点被渲染并可用于我的实际测试。似乎掌握关键的元素是 i 标签。
为清楚起见编辑
如果您查看 https://www.jstree.com/demo/ 我实际上是在尝试在 java selenium 测试中访问 LED 下的建筑节点(因此,如果您在打开页面时查看源代码,没有参考建筑物,但当您打开 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");之后,例如属性已更新,它似乎在页面上什么也不做正在测试),所以我无法 select 我真正想要测试的子项。
谁能给我指出正确的方向?
我在给定的网站上也试过了
此处 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 > Building >Test
下单击 Test
那你可以试试
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")));
您可以在您的应用程序中这样尝试。如果有任何事情请告诉我
我正在尝试使用 jstree 为带有 jsp 页面的 java 应用程序编写一些 selenium 测试。虽然我有相当多的基本测试要遵循,但我并没有做太多这方面的工作。
本质上,id 是自动生成的,所以我使用 xpath 来定位特定的兴趣点。在页面上,我希望 select 的叶子被隐藏了(因此无法用于测试)。因此,我的单元测试中的第一个任务是展开一个特定的 link,因此子节点被渲染并可用于我的实际测试。似乎掌握关键的元素是 i 标签。
为清楚起见编辑
如果您查看 https://www.jstree.com/demo/ 我实际上是在尝试在 java selenium 测试中访问 LED 下的建筑节点(因此,如果您在打开页面时查看源代码,没有参考建筑物,但当您打开 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");之后,例如属性已更新,它似乎在页面上什么也不做正在测试),所以我无法 select 我真正想要测试的子项。
谁能给我指出正确的方向?
我在给定的网站上也试过了
此处 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 > Building >Test
下单击Test
那你可以试试
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")));
您可以在您的应用程序中这样尝试。如果有任何事情请告诉我