使用By.Xpath时出现NoSuchElementException

时间:2014-12-03 13:10:25

标签: java firefox selenium xpath

编辑:

元素在iframe中,这就是最终的工作方式:

WebDriverWait wait = new WebDriverWait(_driver, 60);
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By
            .xpath("//*[@class='IFrameID']")));
WebElement element_t = _driver.findElement(
          By.xpath("//*[@myattribute='mytest']"));

编辑:

我的问题似乎是页面的结构。我尝试了不同的东西,我只能通过id获取身体,我试图通过id或任何其他属性找到的其他元素无法找到......


我试图通过使用By.xpath方法获取一个元素,xpath本身在firebug / firepath中使用时效果很好,但是当在java应用程序中使用时,我得到一个例外:

org.openqa.selenium.NoSuchElementException: Unable to locate element:    {"method":"xpath","selector":".//*[@myattribute='mytest']"}

我尝试访问的属性不是标准的html,而是从框架生成,因此该字段如下所示:

<input id="F_19" class="FIELDInputEdit" type="text" style=" width:100%;" maxlength="40" myattribute="mytest" name="CC">

javacode本身看起来像这样:

WebElement element_t = _driver.findElement(
          By.xpath(".//*[@myattribute='mytest']"));

由于唯一已知的属性是这个,我没有办法访问输入字段。 我使用的是Firefox 17.0.11

3 个答案:

答案 0 :(得分:0)

良好做法(imho)在webdriver中使用xpath之前使用selenium ide(http://docs.seleniumhq.org/download/)测试它

错误可能是因为«。»之前的«。»。尝试删除它。

阅读本文:http://www.w3schools.com/xpath/xpath_syntax.asp

.//*[@myattribute='mytest']

«。»=选择当前节点

«//»=从当前节点中选择与选择匹配的文档中的节点,无论它们位于何处

«*»=匹配任何元素节点

«[@ myattribute ='mytest']»(= [@ myattribute = \“mytest \”])=节点,包含属性“myattribute”,其值为“mytest”

现在,_driver.findElement(By.xpath("//*[@myattribute='mytest']")) =搜索第一个节点的整页,其属性为«myattribute»,其值为«mytest»

_driver.findElement(By.xpath("//input[@myattribute='mytest']"))

=使用«myattribute»=«mytest»

搜索第一页输入的整页

_driver.findElement(By.xpath("//input[@myattribute='mytest']")).then(By.path("./*[@comeAtr]")) =输入«myattribute»=«mytest»找到任何带有atribute =«

的节点

答案 1 :(得分:0)

您是否尝试过使用CSS选择器?

By.cssSelector("input[myattribute=\"mytest\"]")

答案 2 :(得分:0)

元素在iframe中,这就是最终的工作方式:

WebDriverWait wait = new WebDriverWait(_driver, 60);
  wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By
        .xpath("//*[@class='IFrameID']")));
WebElement element_t = _driver.findElement(
      By.xpath("//*[@myattribute='mytest']"));