是否可以找到一个元素,然后等待该元素的子元素?我不知道完整的xpath,因为我正在遍历一组元素。
所以可以说我找到一个元素:
IWebDriver driver = new ChromeDriver(chromeDriverPath);
IWebElement firstElement = driver.FindElement(By.XPath("//table/tr[1]"));
现在我想找到一个子元素,但假装我不知道完整的xpath,因为我正在遍历元素:
IWebElement secondElement = firstElement.FindElement(By.XPath("./td[5]"));
我如何等待第二元素存在,而不仅仅是使用FindElement。通常,我将使用以下代码等待一个元素,但是在这种情况下,我只知道相对于父元素的xpath的xpath。
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var waitedForElement = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.XPath("./td[5]")));
答案 0 :(得分:0)
更新:
发布在here上的答案应该可以解决上述问题
原始:
我一直在寻找相同的答案。到目前为止,我认为没有办法。我一直在寻找这个问题的答案。
我猜您将不得不弄清楚您要为其找到子元素的元素的XPath。完成此操作后,将其添加到用于查找子元素的XPath字体中。听起来不优雅。我明天要尝试一下,看看结果如何。
这是github中的一些讨论,涉及如何从现有元素中撤消XPath。 https://groups.google.com/forum/#!topic/selenium-users/kvGLSzl_GQE
protected String getXPath() {
String jscript = "function getPathTo(node) {" +
" var stack = [];" +
" while(node.parentNode !== null) {" +
" stack.unshift(node.tagName);" +
" node = node.parentNode;" +
" }" +
" return stack.join('/');" +
"}" +
"return getPathTo(arguments[0]);";
return (String) driver.executeScript(jscript, webElement);
}
注意事项:
据我了解,您不应该在wait.Until()中放入element.FindElemen()。内部代码首先执行(FindElement),这违反了wait.Until()的目的,因此,按此警告所述构造的代码将不会等待。
PS:我发现上述解决方案对我不起作用。它确实给了我一个XPath,但是它不适合我从中获得Xpath的元素。
答案 1 :(得分:0)
可以先用这个方法获取父级的xpath
protected String getXPath(IWebElement webElement)
{
String jscript = "function getPathTo(node) {" +
" var stack = [];" +
" while(node.parentNode !== null) {" +
" stack.unshift(node.tagName);" +
" node = node.parentNode;" +
" }" +
" return stack.join('/');" +
"}" +
"return getPathTo(arguments[0]);";
return (String)driver.ExecuteScript(jscript, webElement);
}
然后使用wait.until使用返回的父xpath
var parentElement = driver.FindElement(By.XPath("your xpath to find parent"));
try
{
string xpathParent = getXPath(parentElement);
Console.WriteLine("xpath parent:" + xpathParent);
waitForElement.Until(ExpectedConditions.ElementIsVisible(By.XPath(xpathParent+ "//button[contains(@class,'_8A5w5')]")));//change button[contains(@class,'_8A5w5') with the child element you are waiting for
}
catch (Exception ex)
{
Console.WriteLine(ex);
}