等待C#Selenium中元素的子元素

时间:2018-11-09 22:04:32

标签: c# selenium wait

是否可以找到一个元素,然后等待该元素的子元素?我不知道完整的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]")));

2 个答案:

答案 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);
                                
                            }