Найти по XPath с несколькими элементами, отдельными строками - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь найти элемент на основе того, содержит ли он текст в двух разных местах, извините за отсутствие терминов, я не очень разбираюсь в HTML.Вот HTML-код на сайте:

<article>
    <div class="inner-article">
        <a style="height:150px;" href="/shop/tops-sweaters/tx74hqf5v/lmfhiu5p8">
            <img width="150" height="150" src="//assets.supremenewyork.com/161584/vi/-tUn9HN7n-0.jpg" alt=" tun9hn7n 0">
        </a>
        <h1>
            <a class="name-link" href="/shop/tops-sweaters/tx74hqf5v/lmfhiu5p8">Fade Stripe L/S Top</a>
        </h1>
        <p>
            <a class="name-link" href="/shop/tops-sweaters/tx74hqf5v/lmfhiu5p8">Brown</a>
        </p>
    </div>
</article>

Поиск элемента отдельно работает, но когда я пытаюсь использовать «и», он не работает.Вот что работает:

driver[task].FindElement(By.XPath($"//a[contains(text(),'Fade')]")).Click();
driver[task].FindElement(By.XPath($"//a[contains(text(),'Brown')]")).Click();

Что я пробовал:

driver[task].FindElement(By.XPath($"//a[contains(text(),'Fade') and //a[contains(text(),'Brown')]")).Click();

Не повезло, пожалуйста, помогите, спасибо!Я использую c # и Selenium:)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Что я делаю в подобных случаях, так это нахожу элемент «якорь», а затем нахожу два (или более) элемента, которые являются дочерними элементами этого якоря.

Чтобы соответствовать опубликованному вами HTML, ясобираюсь искать "Fade Stripe L / S Top" и "Brown".Я собираюсь использовать тег ARTICLE в качестве своего якоря.

Обычно я начинаю с того, что делаю что-то простое, а затем строю его.Давайте найдем текст «Fade Stripe L / S Top» в теге A под якорем ARTICLE.

//article//a[.='Fade Stripe L/S Top']
^ double slash means at any level
  ^ the ARTICLE tag
         ^ at any level below that
           ^ an A tag
            ^ that contains the exact text "Fade Stripe L/S Top"

Теперь давайте сделаем то же самое, но для текста «Коричневый»

//article//a[.='Brown']

Действительно просто ... из вашего поста, я полагаю, вы могли бы сделать это самостоятельно или, по крайней мере, следовать за ним.Теперь давайте слегка перевернем его и используем ARTICLE в качестве привязки ... найдите тег ARTICLE, который имеет тег A потомка, который содержит "Brown".

//article[.//a[.='Brown']]

Возвращает *Тег 1020 * вместо тега A, поскольку этот

[.//a[.='Brown']]
 ^ start looking at the tag previously specified
  ^ at any level
    ^ the rest you already know

указывает на то, что это свойство тега ARTICLE (оно заключено в [] s).Итак, теперь у нас есть ARTICLE, который содержит ссылку с текстом «Коричневый».Теперь нам просто нужно убедиться, что он также содержит ссылку с текстом "Fade Stripe L / S Top" и вернуть тег A.

//article[.//a[.='Brown']]//a[.='Fade Stripe L/S Top']
^ this first part is from above
                          ^ this is where the new stuff starts but it should be recognizable

Надеюсь, это имеет смысл.В основном мы находим тег ARTICLE, который содержит одну из ссылок (используя синтаксис [.//tag[property]]), а затем находим потомка //tag[property] и т. Д.

Просто для дальнейшего расширения этого ... мы можемискать любое количество свойств.Надеюсь, это поможет вам лучше увидеть рисунок.

//article [.//a[.='Brown']] [.//a[.='Text2']] [.//a[.='Text3']] //a[.='Fade Stripe L/S Top']

Я добавил пробелы между свойствами для выделения.

//article [.//a  [.='Brown']] //a  [.='Fade Stripe L/S Top']
//tag     [.//tag[property ]] //tag[property]
0 голосов
/ 06 декабря 2018

Я думаю, что вам нужно сделать это или нет, и

a=> driver[task].FindElement(By.XPath($"//a[contains(text(),'Zip')]")).Click();
b=> driver[task].FindElement(By.XPath($"//a[contains(text(),'Brown')]")).Click();

- это не 'a' И 'b', это 'a' ИЛИ ​​'b'

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