C# 如何找到知道子元素的父元素

C# 如何找到知道子元素的父元素,c#,selenium,C#,Selenium,我通过以下方式通过文本找到了一个孩子 Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]")); 问题是我需要单击父元素。页面上的元素是动态显示的,在前面我只知道文本。有可能对其进行编程吗 我的html: 我的文本 我正在使用XPath: using (IWebDriver driver = new ChromeDriver(this.SeleniumD

我通过以下方式通过文本找到了一个孩子

Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]"));
问题是我需要单击父元素。页面上的元素是动态显示的,在前面我只知道文本。有可能对其进行编程吗

我的html:


我的文本
我正在使用XPath:

    using (IWebDriver driver = new ChromeDriver(this.SeleniumDriverPath, driveroptions))
                {
                    try
                    {
                        driver.Navigate().GoToUrl("http://www.google.com/");

                        IWebElement query = driver.FindElement(By.Name("q"));
            query.SendKeys("link");
                    query.Submit();

                        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
                        var listElement = driver.FindElements(OpenQA.Selenium.By.XPath(".//*[@id='search']//div[@class='g']"));
                        foreach( var e in listElement)
                        {
                                    // parent element:
                            var parent = e.FindElement(OpenQA.Selenium.By.XPath("./.."));   //parent element
    parent.Click();
                        }
                    }
                    catch(Exception ex)
                    {
                        ...
                    }

                    driver.Quit();
                }

使用XPath,您可以进行DOM导航,因此您可以首先抓取子元素
IWebElement
,然后使用
的XPath向上导航一级

IWebElement child = Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]"));
child.FindElement(By.XPath("..")).Click();
如果能够修改子XPath,则只需在一次查找中找到父XPath

Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]/..")).Click();
                                                                                          ^ added the parent axis here
还有其他方法可以实现这一点,但这两种方法应该让您开始

参考资料:

您可以使用下面的xpath获取父
列表项
div:

Driver.FindElement(By.XPath("//span[contains(@class,'will-edit')][contains(text(),'MyText')]/ancestor::div[contains(@class,'list-item')][1]"));
要获取带有子span的
列表项
div,请使用MyText

Driver.FindElement(By.XPath("//div[contains(@class,'list-item') and .//span[contains(@class,'will-edit')][contains(text(),'MyText')]]"));
Driver.FindElement(By.XPath("//div[contains(@class,'list-item') and .//span[contains(@class,'will-edit')][contains(text(),'MyText')]]//textarea"));
使用span withMyText获取文本区域:

Driver.FindElement(By.XPath("//div[contains(@class,'list-item') and .//span[contains(@class,'will-edit')][contains(text(),'MyText')]]"));
Driver.FindElement(By.XPath("//div[contains(@class,'list-item') and .//span[contains(@class,'will-edit')][contains(text(),'MyText')]]//textarea"));

我想到了杰夫克的答案。非常感谢你。我重新输入了代码以适应我的情况

IWebElement child=Browser.FindElement(By.XPath(//span[contains(@class,'will-edit-will-edit-edit-input-will-edit-textarea'))][contains(text(),“+name+”)]”);

FindElement(By.XPath(“....”).Click()您好,这可能有帮助:与父元素pleaseA共享HTML在浏览器界面中创建用户。然后他出现在其他人当中。选择它是必要的。我知道创建它的登录名。因此,xpath总是不同的。我可以直接按上面的名字联系。但您需要单击父元素以打开另一个具有其权限的页面。可能存在重复的