Selenium WebDriver:单击表格行内的可见按钮

时间:2016-06-29 06:19:51

标签: javascript java html selenium selenium-webdriver

我的道歉是因为这个问题很长。

更具体地说,我试图点击第4行显示的铅笔图标(编辑按钮)

enter image description here

这是我试图执行的代码:

WebElement ele = driver.findElement(By.xpath("//a[contains(@title, 'Edit Row')]"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
Executor1.executeScript("arguments[0].click();", ele);

这是HTML代码 enter image description here

运行selenium代码后,驱动程序实际上单击了第1行(Administration | NA)的Edit按钮而不是第4行。我发现不仅第一行而且其他行也有相同的HTML代码,唯一的区别是铅笔/编辑按钮被隐藏,因为我不是那个创建该行值的人。

我也尝试过以下代码:

driver.findElement(By.xpath("//a[contains(@title, 'Edit Row')]")).click();

然后我收到了错误

element is not currently visible and so may not be interacted with

看起来驱动程序仍在查看第一行中隐藏的“编辑”按钮,而不是第4行中明显可见的按钮。

无论如何,我可以根据值而不是行号点击“编辑”按钮吗?原因是,在将来,我输入的测试值可能不会在第4行,但在第1行或第10行结束。

最后但并非最不重要的是,我的Safari似乎无法运行JS Executor代码,每次我给它一个去,返回以下错误:

org.openqa.selenium.WebDriverException: 'undefined' is not a function (WARNING: The server did not provide any stacktrace information)

有人可以为我揭开这一点吗?

干杯

4 个答案:

答案 0 :(得分:1)

由于只显示了一个编辑图标,因此下面的代码可以正常工作。

driver.findElement(By.cssSelector("a[title='Edit Row']")).click();

我认为你遇到隐藏元素问题的原因是你使用JSE点击它。 Selenium旨在仅与可见的元素进行交互......用户的方式。 JSE允许您与不可见的元素进行交互。有理由使用JSE,但我不相信这是其中之一。使用JSE,您发现了一个与您的XPath不匹配的元素,然后尝试点击它...因此错误。

答案 1 :(得分:0)

您应该根据字段文本找到该元素,以便它可以找到相应的编辑链接。

functional_area = "Business Development / Innovation"

WebElement ele = driver.findElement(By.xpath("//span[@class='xspTextComputedField'][contains(@text, '" + functional_area + "')]/following-sibling::div/a[contains(@title, 'Edit Row')]"));

您可以通过参数化文本ex使其更具动态性。金融。

答案 2 :(得分:0)

我建议你在firefox中使用一次,然后使用firepath附加组件在firebug中尝试相同的xpath。

尝试检查铅笔图标的xpath。只有一个没有动态值的加工元素,那么你可以使用它。否则评估这个xapth

  //a[contains(@title, 'Edit Row')]

您可以找到一个或多个匹配元素。然后尝试找到所需元素的属性之一的差异。如果你能够通过使用那个奇怪的属性来创建xpath,那么它的on on会转到List并在循环中交叉,然后对它进行处理。

答案 3 :(得分:0)

感谢murali和JeffC的建议,我设法让驱动程序点击显示的铅笔:

List<WebElement> EditButtons = driver.findElements(By.cssSelector("a[title='Edit Row']"));

        for(WebElement button : EditButtons) {
         if(button.isDisplayed()) {
             button.click();
          }
        }

虽然它只解决了一半的问题,但我试图根据旁边的值点击显示的“编辑”按钮。如果我创建了另一行,其值为'Test234',并且该行位于第4行下,则不会点击'Test234'的编辑按钮。有什么建议吗?我试过这个,但它似乎不起作用,驱动程序仍然点击它看到的第一个可见的编辑按钮:

List<WebElement> EditButtons = driver.findElements(By.cssSelector("a[title='Edit Row']"));
String textvalue = driver.findElement(By.xpath("//span[contains(text(),'test456')]")).getText();

        for(WebElement button : EditButtons) {
         if(button.isDisplayed() && textvalue.equalsIgnoreCase("test456")) {
             button.click();
          }
        }

更新:好的,问题解决了,我换回使用xpath而不是cssSelector,然后稍微修改了Vagnesh的建议(感谢Vagnesh !!),现在驱动程序点击我搜索的文本旁边的可见编辑按钮没有经过循环

driver.findElement(By.xpath("//span[contains(text(), 'Enter my desired Text here')]/following::div//a[contains(@title,'Edit Row')]")).click();