css 选择器上的 click() 在 Selenium webdriver 中不起作用
Posted
技术标签:
【中文标题】css 选择器上的 click() 在 Selenium webdriver 中不起作用【英文标题】:click() on css Selector not working in Selenium webdriver 【发布时间】:2012-10-13 23:47:55 【问题描述】:<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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章