Как найти родительский элемент, зная ребенка - PullRequest
0 голосов
/ 14 октября 2019

Я нашел ребенка по тексту следующим образом.

Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]"));

Проблема в том, что мне нужно нажать на родительский элемент. Элемент на странице появляется динамически, и раньше я знал только текст. Можно ли запрограммировать это?

Мой HTML:

<div class="list-item list-item-station ui-draggable ui-draggable-handle">
    <div class="operations">
        <span class="fa fa-times"></span>
    </div>
    <div class="icon-image image-item">
        <span class="fa fa-user"></span>
    </div>
    <div class="icon-name editable-input-long">
        <span class="will-edit will-edit-input will-edit-textarea">MyText</span><textarea class="editable-  textarea"></textarea>
    </div>
</div>

Ответы [ 4 ]

1 голос
/ 14 октября 2019

Я использую 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();
                }
0 голосов
/ 15 октября 2019

Ответ Джеффа дошел до меня. Большое спасибо. Я немного переделал код, чтобы соответствовать моей ситуации.

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

Я думаю, что могут появиться другие ответы. Я не пробовал. Спасибо всем большое!

0 голосов
/ 14 октября 2019

Вы можете получить родительский list-item div с xpath ниже:

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

Чтобы получить list-item div с дочерним span с MyText :

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

Получить текстовую область, используя span с MyText :

Driver.FindElement(By.XPath("//div[contains(@class,'list-item') and .//span[contains(@class,'will-edit')][contains(text(),'MyText')]]//textarea"));
0 голосов
/ 14 октября 2019

С XPath вы можете выполнять DOM-навигацию, чтобы начать с захвата IWebElement, который является дочерним, а затем использовать XPath, равный .., для перехода на один уровень вверх.

IWebElement child = Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]"));
child.FindElement(By.XPath("..")).Click();

Если выВы можете изменить свой дочерний XPath, вы можете просто найти родителя в одном поиске.

Driver.FindElement(By.XPath("//span[contains(@class,'MyClass')][contains(text(),'MyText')]/..")).Click();
                                                                                          ^ added the parent axis here

Есть и другие способы сделать это, но эти два метода должны помочь вам начать.

Ссылка:
MDN Web-документы - родитель

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...