我试图解决点击下一页中制定的某一行的问题: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调用此方法,点击总是在第一行的链接上。我做错了什么?
答案 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();