Selenium получит динамический идентификатор XPath - PullRequest
4 голосов
/ 15 ноября 2010

Я новичок в Selenium, здесь новенький, и мой английский не самый лучший.

Я использую селен с .NET ...

У меня есть такая HTML-страница, но количество событий отличается:

<div id="eventContent" style="text-align: center;">
       <div class="event" id="event-8971062">
            <ul>
                <li ...></li>
                <li ...></li>
                <li ...></li>
            </ul>
       </div>                    
       <div class="event odd" id="event-9224880">
            <ul>
                <li ...></li>
                <li ...></li>
                <li ...></li>
            </ul>
        </div>          
</div>

Мне нужно проверить все данные в разных div, но число является динамическим, и идентификатор (события) также является динамическим. Сначала я пытаюсь узнать количество элементов div, но это не работает. Для этого я пытаюсь это:

DefaultSelenium selenium = new DefaultSelenium(...);
decimal count = selenium.GetXpathCount("//div[@id='eventContent']");

но в этом примере это только 1, а не два в этом примере.

когда я пытаюсь:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]"));

печатает все div, но когда я делаю:

Console.WriteLine(selenium.GetText("//div[@id='eventContent'][1]/div"));

он печатает только первый div, и я не понимаю, почему. Может ли кто-нибудь быть таким добрым и объяснить мне, что здесь происходит и в чем я не прав?

Заранее спасибо elur

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010
decimal count = selenium.GetXpathCount("//div[@id='eventContent']");

Это вернет счетчик div с id, равным eventContent - есть только один div, как этот, поэтому вы получаете счет 1 (переменные подсчетаобычно int с, а не decimal с, случайно).

Если вы хотите, чтобы количество содержало div с, используйте

int count = selenium.GetXpathCount("//div[@id='eventContent']/div");

Это будет считать число div детей из div с id из eventContent.Это должно вернуть 2, как вам нужно.

Что касается ваших GetText примеров, я думаю, GetText вернет только текст first узла, который выбрал аргумент xpath.Таким образом, с

selenium.GetText("//div[@id='eventContent'][1]")

вы получите весь текст parent div, который, естественно, содержит все дочерние элементы div s, но с

selenium.GetText("//div[@id='eventContent'][1]/div")

Вы получаете текст только первый ребенок div.Этот xpath выбирает все дочерние элементы div s, но GetText, я полагаю, работает только с одним элементом.Если вы хотите просмотреть текст каждого дочернего элемента div по очереди, вам сначала нужно получить счетчик дочерних элементов div s, а затем использовать цикл for для получения каждого из них по очереди:

for(int i = 1; i <= count; ++i)
{
    string childXpath = "//div[@id='eventContent']/div[" + i + "]";
    string eventText = selenium.GetText(childXpath);

    // Processing of eventText
}

Цикл for и ручная обработка xpath необходимы здесь (а не точнее foreach), так как я считаю, что у Selenium нет способа получить xpath и вернуть коллекцию элементов.

0 голосов
/ 15 ноября 2010

попробовал это, но возвращается с 0. Я решил это с помощью выражения while, где я проверяю с помощью isElementPresent, например:

int a = 1;
while (selenium.IsElementPresent("//div[@id='eventContent'][1]/div[" + a + "]"))
{
    // check data here
    a++;
}

, кажется, работает так. большое спасибо за вашу помощь, С наилучшими пожеланиями elur

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