Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Selenium单击多行单选按钮_C#_Selenium_Selenium Webdriver - Fatal编程技术网

C# 使用Selenium单击多行单选按钮

C# 使用Selenium单击多行单选按钮,c#,selenium,selenium-webdriver,C#,Selenium,Selenium Webdriver,我正在使用网页上的一个表,其中有X行。每行代表一个请求者,请求授予或撤销某些内容。此自动化的目的是自动批准授予或撤销。以下代码可以工作,但奇怪的是,仅适用于第一次授予或撤销: var table = driver.FindElement(By.XPath(@"//*[@id=""span_pending_approvals""]/form/table/tbody")); var rows = table.FindElements(By.TagNam

我正在使用网页上的一个表,其中有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();正在按预期处理每一行,但它实际上只在网页上注册首次出现的“授予”或“撤销”。

如下更新脚本

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的开头,尝试更改此行
row.FindElement(By.xpath(“//input[@value='approve']”)。单击()
to
row.FindElement(By.XPath(“.//input[@value='approve'])。单击()
行.FindElement(By.XPath(“//input[@value='revoke'])。单击()
将这一行添加到
行.FindElement(按.XPath(“.//input[@value='revoke'])。单击()。只需在第行xpath的开头使用
,将作用域限制在当前行,而不是整个dom,这就成功了。谢谢将答案从评论移至此处。如果您认为问题已经解决,请接受解决方案。请随意投票:-)