Я пытаюсь решить вопрос о нажатии на определенную строку, которая сформулирована на следующей странице: https: //testwisely.com/demo/event-table. Я столкнулся с этим вопросом, прочитав книгу «Рецепты Selenium WebDriver на C #». Я написал следующую задницу класса pageobject:

    public void ClickTableLink(String issueNumber)
    {
        ReadOnlyCollection<IWebElement> tableRows =
            driver.FindElements(
                By.XPath(
                    ".//*[@id='complaintsTable']/tbody/tr[contains (@class, 'gridLayoutEvenRow' ) or contains(@class, 'gridLayoutOddRow')]"));
        foreach (IWebElement row in tableRows)
        {
            try
            {
                row.FindElement(By.XPath("td[contains(text(), '" + issueNumber + "')]"))
                    .FindElement(By.XPath("//td/a"))
                    .Click();
                break;
            }
            catch (NoSuchElementException e)
            {
            }
        }
    }

Проблема в том, что независимо от того, с каким номером issueNumber я называю этот метод, щелчок всегда происходит по ссылке в первой строке. Что я делаю не так?

0
Frank 26 Ноя 2016 в 16:40

4 ответа

Лучший ответ

Основываясь на вашем комментарии об использовании прямого подхода против использования таблицы, вы также можете просто сделать следующее, используя замену строки.

        Driver.FindElement(By.XPath(string.Format("//td[contains(text(), '{0}')]//preceding-sibling::td/a", issueNumber))).Click();
0
Dazed 27 Ноя 2016 в 15:57

Поскольку мне нравится элегантность ответа, я попытался получить ответ, что @JeffC работает, но безуспешно, вероятно, потому, что моих знаний выражений XPath недостаточно. После некоторых изменений мне удалось получить ответ о работе @Dazed.

    public void ClickTableLink(String issueNumber)
    {
        var table = driver.FindElements(By.TagName("tr"));
        foreach (var tr in table)
        {
            var tds = tr.FindElements(By.TagName("td"));
            for (var i = 0; i < tds.Count; i++)
            {
                if (tds[i].Text.Trim().Contains(issueNumber))
                {
                    tds[i - 3].Click();
                    break;
                }

            }
        }
    }
0
Frank 27 Ноя 2016 в 11:14

Вы можете сделать это в основном с помощью однострочника, используя XPath. XPath будет искать TD, который содержит желаемый номер проблемы, находить родительский TR, а затем находить дочерний TD с id = "applicationDateId". Я бы обернул это функцией, чтобы ее можно было использовать повторно.

static void ClickEvent(string issueNumber)
{
    Driver.FindElement(By.XPath("//tr[td[contains(., '" + issueNumber + "')]]/td/a")).Click();
}

Вы бы назвали это так,

 ClickEvent("2898");
0
JeffC 27 Ноя 2016 в 16:32

Вы можете попробовать это. Он будет перебирать и находить номер проблемы. Затем, если вы посмотрите на tds[i - 3].Click();, он увидит 3 столбца слева от номера проблемы и щелкнет по нему. Вы можете перейти справа от issueNumber, используя + 3. Просто измените это значение в зависимости от того, в каком столбце оно находится по отношению к issueNumber.

  public void ClickTableLink(String issueNumber)
   {
      var table =  driver.FindElement(By.Id("complaintsTable"));
    foreach (var tr in table.FindElements(By.TagName("tr")))
    {
       var tds = tr.FindElements(By.TagName("td"));
        for (var i = 0; i < tds.Count; i++)
        {
            if (tds[i].Text.Trim().Contains(issueNumber))
            {
                tds[i - 3].Click();
               break;
            }

        }
      }
    }
0
Dazed 27 Ноя 2016 в 16:42