我正试图在Selenium WebDriver的帮助下在Chrome中找到一个web元素。当驱动程序启动URL时,将显示一个项目列表,并且驱动程序必须从该列表中选择一个特定项目。
只要该项目在列表的顶部,就可以找到该项目,但是,如果该项目位于列表的最底部(按照列表的字母顺序排列,并尝试选择列表中的记录57),则测试一直失败,驱动程序找不到web元素!!!
我终于到了这个地步,我需要滚动我的列表,直到那个项目出现,但根据这个滚动条在菜单中,而不是在主窗口中,这个命令甚至没有执行!我是否需要将项目菜单识别为驱动程序?如何在窗口中向下滚动项目菜单?我不想滚动主Web窗口,我只需要在项目列表中滚动。
我尝试了所有可能的解决方案,并在Stack Overflow论坛和互联网上冲浪,但无法修复这个错误。如果你们能看看下面的代码并给我一些建议,那就太好了。如果我需要提供更多信息,请告诉我。值得一提的是,我正在阅读电子表格中的"projectName"。
// Initially I need to hover the mouse on Select Project menu.
Actions action = new Actions(driver);
WebElement list = driver.findElement(By.xpath("//*[@id="gridview-1032"]"));
action.moveToElement(list);
JavascriptExecutor js = (JavascriptExecutor) driver;
// Now I need to scroll down till find my desire project in the list.
WebElement Project = driver.findElement(By.xpath("//*[text()= '"+ projectName +"']"));
js.executeScript("arguments[0].scrollIntoView(true);",Project);
Project.click();
实际结果:
线程"main"org.openqa.selenium.NoSuchElementException异常:没有这样的元素:找不到元素:{"方法":"xpath","选择器":"//*[text()='projectName]"}
预期结果:在列表中找到元素,然后单击该项以启动项目!
下面是适用于我的代码
Actions action = new Actions(driver);
WebElement list = driver.findElement(By.xpath("//*[@id="gridview-1032"]"));
action.moveToElement(list);
JavascriptExecutor js = (JavascriptExecutor) driver;
// Now I need to scroll down till find my desire project in the list.
WebElement Project = driver.findElement(By.xpath("//*[text()= '"+ projectName +"']"));
js.executeScript("arguments[0].click();",Project);
我为这个问题找到了一个更简单的替代解决方案:
//创建Javascript执行程序的实例
JavascriptExecutor je = (JavascriptExecutor) driver;
//识别向下滚动后将出现的WebElement
WebElement Project = driver.findElement(By.className("x-grid-item-container"));
//现在执行查询,该查询实际上会滚动,直到该元素并没有出现在页面上。
je.executeScript("arguments[0].scrollIntoView(true);",Project);
//登录到所需项目
Project.click();
我认为这可能是其他人的问题,我也在添加我的解决方案,它可能会有所帮助:
//它找到列表并滚动3000像素
EventFiringWebDriver eventFiringWebDriver = new EventFiringWebDriver(driver6);
eventFiringWebDriver.executeScript("document.querySelector('#gridview-1032').scrollTop=3000");
//找到项目并登录
WebElement Project = driver6.findElement(By.xpath("//*[text()= '"+ projectName +"']"));
Project.click();