无法单击 Selenium 和 Java 的树视图

Posted

技术标签:

【中文标题】无法单击 Selenium 和 Java 的树视图【英文标题】:Can't click on a treeview with Selenium and Java 【发布时间】:2022-01-21 04:49:57 【问题描述】:

我基本上是自动化测试的新手,一直在使用 JAVA+SELENIUM、Eclipse。

一直在尝试使用 geckodriver.exe Webdriver 打开“欧洲”树。一直在寻找解决方案,但无济于事。

这是需要测试的页面。 https://js.devexpress.com/Demos/WidgetsGallery/Demo/Common/NavigationOverview/Angular/Light/

我的打开树的代码。

public class Test_suite 
    
    @Test
    public void testAssertFunctions() throws InterruptedException 
        System.setProperty("webdriver.firefox.driver", "C:\\selenium-3.141.59\\draiveri\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
driver.navigate().to("https://js.devexpress.com/Demos/WidgetsGallery/Demo/Common/NavigationOverview/Angular/Light/");
        Thread.sleep(10000);
        WebElement fruits = driver.findElement(By.xpath("/html/body/div/demo-app/div/div[1]/dx-tree-view/div[2]/div/div/div[1]/ul/li[4]/div[2]"));
        fruits.click();
        
    

我似乎找不到该元素,尝试了多个findElement.by 选项,但无济于事。唯一可行的解​​决方案是使用 Selenium IDE,它单击以展开树,并显示 xpath=//li[4]/div[2],但将该路径复制到 eclipse 后,仍然找不到元素。

【问题讨论】:

【参考方案1】:

请试试这个:

public class Test_suite 
    @Test
    public void testAssertFunctions() throws InterruptedException 
    System.setProperty("webdriver.firefox.driver", "C:\\selenium- 
    3.141.59\\draiveri\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.navigate().to("https://js.devexpress.com/Demos/WidgetsGallery/Demo/Common/NavigationOverview/Angular/Light/");
    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//iframe[@id='demoFrame']")));
    driver.switchTo().frame(driver.findElement(By.xpath("//iframe[@id='demoFrame']")));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='Europe']"))).click();
    

【讨论】:

试过这个解决方案,但现在我得到了 timeoutException,我什至将等待更改为 30,但它就是找不到那个元素。原因:org.openqa.selenium.NoSuchElementException:无法定位元素://span[text()='Europe'] 对不起。该元素位于 iframe 内。因此,您必须先切换到该 iframe 才能访问此元素。请参阅我的更新答案。 更新版本有效,但作为上面的答案,如果单击欧洲按钮,则需要双击才能打开树。有没有办法触发三角展开按钮,那么就一键搞定。【参考方案2】:

有几点:

使用Selenium v3.x 以后,使用GeckoDriver 是强制性的,所以不要:

webdriver.firefox.driver

我们需要使用:

webdriver.gecko.driver

您需要使用相对xpath,而不是绝对xpath

所需的WebElement 也在iframe

理想情况下,在任何可点击元素上click(),您需要为elementToBeClickable()诱导WebDriverWait,您可以使用以下Locator Strategy。

您的有效代码块将是:

@Test
public void testAssertFunctions() throws InterruptedException 
    System.setProperty("webdriver.gecko.driver", "C:\\selenium-3.141.59\\draiveri\\geckodriver.exe");
    WebDriver driver = new FirefoxDriver();
    driver.navigate().to("https://js.devexpress.com/Demos/WidgetsGallery/Demo/Common/NavigationOverview/Angular/Light/");
    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[@class='demo-frame' and @name='demo-frame']")));
    WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[text()='Europe']")));
    new Actions(driver).moveToElement(element).doubleClick(element).build().perform();

【讨论】:

@class= 后面要写什么? @PēterisSpura 查看更新的答案并告诉我状态。 测试通过了,虽然我没有看到打开树所需的点击,但它仍然没有打开。 我认为这里的问题是点击的是欧洲按钮,而不是树扩展按钮。我可以尝试双击,然后它应该会打开。 @PēterisSpura 查看更新的答案并告诉我状态

以上是关于无法单击 Selenium 和 Java 的树视图的主要内容,如果未能解决你的问题,请参考以下文章

消息:尝试通过 Selenium 单击下拉菜单中的选项时,元素 <option> 无法滚动到视图中

单击图像时“元素无法单击”-Selenium WebDriver Java [重复]

在 selenium java 中单击下载按钮无法正常工作

无法使用Selenium Java脚本在模式对话框中单击项目

如何通过 Java 使用 XPath 和 Selenium WebDriver 单击 SVG 元素

ExtJs 4.1-通过单击另一个视图中的树节点将选项卡添加到选项卡视图