【问题标题】:Selenium Webdriver can not locate element by xPathSelenium Webdriver 无法通过 xPath 定位元素
【发布时间】:2017-06-01 13:09:02
【问题描述】:

我正在使用两种不同的方式通过 Selenium webdriver (JavaScript) 访问 Web 元素。

第一种方式使用数字表示父div 中的第三个div 元素。代码是这样的:

driver.findElement(By.xpath("//div[@id='sld-layer-container']/div/div/ul/li[2]/div/div[2]/div/div[3]/select/option[2]")).click();

此代码不起作用。它返回错误:ElementNotVisibleError: element not visible: Element is not currently visible and may not be manipulated

第二种方式使用类来识别父div中的特定div。代码是这样的:

driver.findElement(By.xpath("//div[@id='sld-layer-container']/div/div/ul/li[2]/div/div[2]/div/div[@class = 'col-md-5']/select/option[2]")).click();

如您所见,唯一的区别是 xPath 字符串中最后一个 div 元素的标识符。他们应该指出同样的事情。神奇的是,第二个有效,但第一个无效。

这是css元素的截图。突出显示的div 是我要查找的内容。

谁能帮我解决这个问题?

更新 1:

根据@Mahipal 和@iamkenos 的要求,我使用了div,现在它显示selectoption。我认为这个问题只是由于无法找到div 而引起的,但似乎不是。请进一步帮助。

【问题讨论】:

  • 您想从下拉列表中选择一个选项,或者直接访问div。因为,在查看了您的 xpath 之后,您似乎正在尝试从下拉列表中选择一个选项。如果是这种情况,是否可以展开 div 标签,以便可以看到 select 控件的 html?
  • 查看您的代码,您正尝试点击某个select 下拉列表中的option[2]。如果是这种情况,还有其他方法可以做到这一点。另外,我建议不要过多依赖基于索引的 xpath 定位器,因为 html 设计可能会在开发阶段特别频繁地更改。正如 Mahipal 建议的那样,请展开突出显示的 div,以便我们进一步为您提供帮助。 PS。请提供实际的 sn-p,而不是屏幕截图。
  • 能否提供给我们完整的DOM
  • 谢谢!我已经在更新 1 中上传了消耗的 div。请帮忙。 @iamkenos
  • 谢谢!我已经在更新 1 中上传了消耗的 div。请帮忙。 @Mahipal

标签: javascript selenium xpath selenium-webdriver selenium-chromedriver


【解决方案1】:

你可以尝试如下:

 Select select = new Select (driver.findElement(By.xpath("//div[@id='sld-layer-container']/div/div/ul/li[2]/div/div[2]/div/div[3]/select")));

 select.selectByVisibleText("PROJECT_VALUE");

【讨论】:

  • 我正在使用 JavaScript。它有选择对象吗?
  • 我使用了这段代码,它抱怨没有 selectByVisibleText 存在。 let select = this.driver.findElement(By.xpath("//div[@id='sld-layer-container']/div/div/ul/li[2]/div/div[2]/div/div[3]/select")); select.selectByVisibleText("PROJ_TYPE");
  • 粘贴新的屏幕截图后,您可以看到它有 Select 对象。
  • 对不起,我把你弄糊涂了。我的意思是如果 Javascript 的 selenium web 驱动程序语言本身具有选择对象的概念。如果是这样,我该如何导入它。我试过webdriver.Select,但它不起作用。
  • 试试((JavascriptExecutor) driver).executeScript("return document.getElementById('id').selectedIndex = '" + index + "';)
【解决方案2】:

你也可以试试下面的 xpath...

//div[@id='featureClassList']//div[@class='col-md-5']

【讨论】:

  • 您正尝试从较低级别的 div 开始。不幸的是,featureClassList 和 'col-md-5' 并不相同。即使它有效,它也没有回答我的问题。
  • Kushal 的 Select 对象上方是用于“选择”html 标记下拉列表的最佳对象。唯一的问题是,当您使用 Absolute Xpaths 时,它不会一直工作。您需要找到相对 xpath,即您的意思是较低级别的 div。相对xpath: '//div[@id='featureClassList']//select//option[text()='PROJECT_VALUE']' "//div[@id='featureClassList']" 很重要找Select 对象的相应父级。
  • 谢谢!它解释了我的问题。如您所见,我使用的 xpath 是从//div[@id='sld-layer-container'] 开始的。我认为这是在这种情况下我能找到的最低的相同项目。如果我还想从这个对象入手,那么绝对路径和相对路径有什么区别?
  • 另一个问题,我可以在相对路径中使用索引号吗?
  • 绝对 xpath 包括来自元素的所有超级父级的路径。像这样:“//div[@id='sld-layer-container']/div/div/ul/li[2]/div/div[2]/div/div[3]/select”,其中选择是您要识别的元素,并且在 div 之前是父元素。而相对 xpath 涉及使用任何元素属性(例如 id、类、文本、标签等)来构建 xpath。如果仍然找到具有相同属性的元素,我们就去寻找它的下一个父元素属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
相关资源
最近更新 更多