Xpath匹配一个节点但不在webdriver中工作

时间:2016-10-27 16:56:32

标签: eclipse xpath selenium-webdriver

在firepath中正确验证的XPath和匹配的1节点在selenium webdriver(java)中无法正常工作是否正常?我有一个动态元素,我使用" contains"生成了一个XPath。匹配恰好与我正在寻找的元素相同的单个节点的方法。在eclipse中,webdriver会抛出一个" NoSuchElementException"因为它无法找到元素。在你认为你已经掌握了Xpath背后的技巧之后,一些顽固的小元素会发现你的缺陷。

对于附加的html,我生成了以下的Xpath。任何人都可以帮助生成一个XPath甚至CSS吗?

//div[contains(@id, 'gwt-uid') and @aria-selected='true']

enter image description here

3 个答案:

答案 0 :(得分:2)

是。使用Firebug进行XPATH匹配的可能性(在开发模式期间,您手动访问过的页面)可能无法在运行时识别(使用selenium启动的浏览器)。这不是因为Firebug显示错误,而是XPATH使用的HTML可能不一样(可能已经改变,可能是微妙的改变)。

我强烈建议暂停(不要停止)在运行期间执行(一种方法是使用Thread.sleep(100)(100秒))给你足够的时间再次评估你的XPATH以查看匹配。发表你的意见。

XPATH似乎很好。

可疑,aria-selected设置为false

答案 1 :(得分:1)

我认为找By.CssSelector会更容易:

driver.FindElement(By.CssSelector("div[id^='gwt-uid']"));

虽然我担心可能会有其他元素的前缀为'gwt-uid',因为我假设它是一个动态唯一ID。您可以首先获得已知的最近父级(id='consumerTree'),以确保您最终得不到错误的元素。在C#中:

IWebElement parent = driver.FindElement(By.Id("consumerTree"));
IWebElement element = parent.FindElement(By.CssSelector("div[id^='gwt-uid']"));

答案 2 :(得分:1)

(假设您正在使用Java)如果您将NoSuchElementException作为提供的例外,可能有以下原因: -

  • 可能是在你要找到元素的时候,它不会出现在DOM上,所以你应该实现WebDriverWait等待元素可见,如下所示: -

    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div#consumerTree div.v-tree-node[id*='gwt-uid']")));
    
  • 此元素可能位于任何frameiframe内。如果是,您需要在找到以下元素之前切换frameiframe: -

    WebDriverWait wait = new WebDriverWait(driver, 10);
    
    //Find frame or iframe and switch
    wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("your frame id or name"));
    
    //Now find the element 
    WebElement el = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("div#consumerTree div.v-tree-node[id*='gwt-uid']")));
    
    //Once all your stuff done with this frame need to switch back to default
    driver.switchTo().defaultContent();