css 选择器上的 click() 在 Selenium webdriver 中不起作用

Posted

技术标签:

【中文标题】css 选择器上的 click() 在 Selenium webdriver 中不起作用【英文标题】:click() on css Selector not working in Selenium webdriver 【发布时间】:2012-10-13 23:47:55 【问题描述】:

html

<input class="button" type="button" onclick="$.reload('results')" value="Search">

我没有这个的 id 或名称。所以我写了

FirefoxDriver driver = new FirefoxDriver();
driver.get("http://....");
driver.findElement(By.cssSelector("input[value=Search]")).click();

但是 click() 没有发生。

试过了 driver.findElement(By.cssSelector(".button[value=Search]")).click();

试过了 value='Search'(单引号)。

这些选择器正在工作

.button[value=Search] 
padding: 10px;

input[value=Search] 
padding: 10px;

【问题讨论】:

看起来不错。你确定driver.get() 加载了正确的页面吗?你在使用任何 JS 框架吗?也许您必须等待一些 ajax 调用完成。 它找到它但不点击它吗?抛出异常? 我很幸运 driver.get() 加载了我的页面。 @Arran 一直被这个问题困扰;不确定它是否找到了我的“搜索”按钮 如果使用 Firefox,请将 IDE 与您的选择器一起使用,并验证 IDE 是否确实看到了某些内容。 【参考方案1】:

我会注入一段 js 以有信心解决这个问题:

首先使用 DOM 定位元素(在 firebug 中验证):

public void jsClick()

        javascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("document.getElementsByTagName('button')[0].click();");
        js.executeScript(stringBuilder.toString());
    
jsClick();

从你的元素的回顾来看,它是这样的:

....
stringBuilder.append("document.getElementsByTagName('input')[0].click();");
....

请注意:document.getElementsByTagName('input') 返回一个 DOM 元素数组。并正确索引它,例如document.getElementsByTagName('input')[0], document.getElementsByTagName('input')1, document.getElementsByTagName('input')[2].... 等你将能够找到你的元素。

希望这对您有所帮助。 问候。

【讨论】:

这有助于找到元素,但 click() 没有发生。驱动程序未执行 click();是因为我在这个输入上有我的 onclick 事件吗? 好吧,试着一步一步定位你的错误。在firefox中打开你的页面,打开firebug,在firebug中打开控制台,然后尝试在控制台中执行以下代码:document.getElementsByTagName('button')[0].click() 看看会发生什么 javascript 'click' 方法很健壮,对我来说总是有效的。如果没有任何反应 - 你应该仔细检查你是否正确地找到了 web 元素 'Run' on document.getElementsByTagName('button')[5].click();工作得很好。我只有这个 public void jsClick() JavascriptExecutor js = (JavascriptExecutor) driver; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("document.getElementsByTagName('button')[0].click();"); js.executeScript(stringBuilder.toString()); jsClick(); nice) 所以你可以在这个公共 jsClick 中看到你提到了不正确的 arg 顺序。将 'document.getElementsByTagName('button')[0]' 更改为 'document.getElementsByTagName('button')[5]'。所以我可以看到它是: public void jsClick() JavascriptExecutor js = (JavascriptExecutor) driver; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("document.getElementsByTagName('button')[5].click();"); js.executeScript(stringBuilder.toString()); jsClick();【参考方案2】:

请使用以下代码。

driver.findElement(By.cssSelector("input[value=\"Search\"]")).click();

它对我有用。并确保名称是“搜索”,因为它区分大小写。

谢谢

【讨论】:

【参考方案3】:

你确定在你的页面上使用这个 CSS 选择器 (input[value=Search]) 你只有一个结果吗?

【讨论】:

【参考方案4】:

您的代码中缺少单引号,应将 [value=Search] 替换为 [value='Search']

首先你必须检查你正在使用的选择器是否可以工作..

如果您使用的是chrome或FF,您可以按照以下步骤操作,

    转到存在按钮(要单击)的页面,

    打开 web 控制台并输入以下内容并单击 enter..

    $("input[value='Search']")

$("input[value='Search'][type='button']")

$("input[value='Search'][type='button'].button")

您将获得可以使用此选择器访问的元素列表,如果该列表仅包含一个元素(您要单击的按钮),则此选择器对您的使用有效..否则您必须尝试其他选择器..

如果上述任何一个选择器是有效的,你必须相应地改变你的代码..

driver.findElement(By.cssSelector("input[value='Search'][type='button'].button")).click();

【讨论】:

以上是关于css 选择器上的 click() 在 Selenium webdriver 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

覆盖链式选择器上的 Tailwind CSS @apply 指令

新建div触发绑定在元素选择器上的js事件

css3微调器上的抽搐动画

选择器上的选择器

引导日期选择器上的棘手问题

选择器上的 PHP 逻辑问题