在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']
答案 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']")));
此元素可能位于任何frame
或iframe
内。如果是,您需要在找到以下元素之前切换frame
或iframe
: -
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();