我正在处理X行的网页上的表格。每行都代表一个请求者,请求要授予或撤消某些请求。这种自动化的目的是自动批准授予或撤销。以下代码有效,但-奇怪的是-仅分别用于首次授予或撤销:
var table = driver.FindElement(By.XPath(@"//*[@id=""span_pending_approvals""]/form/table/tbody"));
var rows = table.FindElements(By.TagName("tr"));
var rowCount = 1;
foreach (var row in rows)
{
if (row.Text.Contains("Grant"))
{
var requester = row.Text.Split(' ')[3];
row.FindElement(By.XPath("//input[@value='approve']")).Click();
}
else if (row.Text.Contains("Revoke"))
{
row.FindElement(By.XPath("//input[@value='revoke']")).Click();
}
rowCount++;
}
此输出总计:
Amy - Grant[X] Wait[]
Andy - Grant[] Wait[]
Anthony - Grant[] Wait[]
Brad - Revoke[X] Wait[]
Beth - Revoke[] Wait[]
Bort - Revoke[] Wait[]
当我想要的是:
Amy - Grant[X] Wait[]
Andy - Grant[X] Wait[]
Anthony - Grant[X] Wait[]
Brad - Revoke[X] Wait[]
Beth - Revoke[X] Wait[]
Bort - Revoke[X] Wait[]
关于为什么仅在每个选项的第一次出现时起作用的想法?当我逐步调试时,可以看到.Click();。会按预期对每一行进行处理,但实际上它仅在网页上注册了“ Grant”或“ Revoke”的首次出现。
答案 0 :(得分:1)
如下更新脚本。
foreach (var row in rows)
{
if (row.Text.Contains("Grant"))
{
var requester = row.Text.Split(' ')[3];
row.FindElement(By.XPath(".//input[@value='approve']")).Click();
}
else if (row.Text.Contains("Revoke"))
{
row.FindElement(By.XPath(".//input[@value='revoke']")).Click();
}
rowCount++;
}
只需将范围限制为当前行,而不是整个dom。在xpath在行下的开头