Селен: Получить весь текст с тем же идентификатором - PullRequest
1 голос
/ 30 июня 2011

Xpath элементов, которые я хочу прочитать (бухгалтерия, бизнес, маркетинг, технологии), выглядит следующим образом:

/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[2]/font/a
/html/body/table/tbody/tr/td[2]/table/tbody/tr/td[4]/font/a
/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[2]/font/a
/html/body/table/tbody/tr/td[2]/table/tbody/tr[3]/td[4]/font/a

Идентификатор для всех элементов:

//font[@class='wlCategoryLinkBold']/a

Страница, которую я тестирую, похожа на следующую:

enter image description here

У меня есть следующий метод испытаний:

public void ListAllLinksInArray()
    {
        SelObj = new DefaultSelenium("localhost", 4444, "*iexplore", "http://localhost/crm.aspx");
        SelObj.Start();
        SelObj.Open("http://localhost/crm.aspx");            
        SelObj.SelectFrame("content");

        List<string> topics = new List<string>();

        int count = (int)SelObj.GetXpathCount("//font[@class='wlCategoryLinkBold']/a");


        for (int i = 1; i <= count; i++)
        {
            if (SelObj.IsElementPresent("//font[@class='wlCategoryLinkBold']/a"))
            {
                string value = SelObj.GetText("//font[@class='wlCategoryLinkBold']/a[" + i + "]");             topics.Add(value);
            }
        }

        string[] arrTopics = topics.ToArray();

        System.IO.File.WriteAllLines(@"C:\WriteLines.txt", arrTopics);

    }

Приведенный выше код записывает учет (только один раз) в текстовый файл.

Если я это сделаю:

string value = SelObj.GetText("//font[@class='wlCategoryLinkBold']/a");

Я получаю Бухгалтерский учет (4 раза) в текстовом файле.

Что не так в цикле, который не печатает все четыре ссылки в текстовом файле. Заранее спасибо!

1 Ответ

3 голосов
/ 01 июля 2011
//someElement[$k]

где $ k - положительное целое число, а не то, что вы думаете.

Это означает:

Выберите все элементы в документе XML с именем someElement, которые являются $k -ым дочерним элементом их родителя.

Однако из всех a элементов в выражении XPath, которое вы используете, все они кажутся первым и единственным потомком своих родителей. Это означает, что для всех i, отличных от 1, выражение XPath ничего не выбирает.

Вот почему вы выбираете только первый a.

Решение

Вместо :

"//font[@class='wlCategoryLinkBold']/a[" + i + "]"

Используйте

"(//font[@class='wlCategoryLinkBold']/a)[" + i + "]"

Помните : В Xpath оператор [] имеет более высокий приоритет (приоритет), чем псевдо-оператор //. Как обычно, можно указать разные приоритеты, используя скобки.

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