使用硒单击多行单选按钮

时间:2019-07-04 03:03:05

标签: c# selenium selenium-webdriver

我正在处理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”的首次出现。

1 个答案:

答案 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在行下的开头