Selenium C#点击错误的tablerow

时间:2016-11-26 13:40:19

标签: c# selenium

我试图解决点击下一页中制定的某一行的问题:https://testwisely.com/demo/event-table。我通过阅读C#中的Selenium WebDriver Recipes一书来解决这个问题。我有一个写了一个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调用此方法,点击总是在第一行的链接上。我做错了什么?

4 个答案:

答案 0 :(得分:0)

你可以试试这个。它将循环并找到问题编号。然后,如果您查看tds[i - 3].Click();,它将查看issueNumber左侧的3列并单击它。您可以使用+ 3转到issueNumber的右侧。只需根据与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;
            }

        }
      }
    }

答案 1 :(得分:0)

你基本上可以使用XPath进行单线程。 XPath将查找包含所需问题编号的TD,找到父TR,然后找到id =“applicationDateId”的子TD。我会将它包装在一个函数中,以便它可以重用。

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

你会称之为,

 ClickEvent("2898");

答案 2 :(得分:0)

因为我喜欢答案的优雅,我试图得到@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;
                }

            }
        }
    }

答案 3 :(得分:0)

根据您对使用直接方法与使用表格的评论,您也可以使用字符串替换来执行以下操作。

        Driver.FindElement(By.XPath(string.Format("//td[contains(text(), '{0}')]//preceding-sibling::td/a", issueNumber))).Click();