Selenium CSS选择器由id和多个类组成

Ren*_*aud 9 css-selectors selenium-webdriver

在这里第一次使用硒,我想知道为什么:

final WebElement justAnId = findElement(By.cssSelector("#someId"));
final WebElement whatIWant = justAnId.findElement(
    By.cssSelector(".aClass.andAnother input[type=text]")
);
Run Code Online (Sandbox Code Playgroud)

有效,但不是:

final WebElement whatIWant = findElement(By.cssSelector(
    "div#someId.aClass.andAnother input[type=text]"
));
Run Code Online (Sandbox Code Playgroud)

虽然他们似乎与我相当,但我得到:

org.openqa.selenium.NoSuchElementException: Unable to locate element:
{"method":"css selector","selector":"div#someId.aClass.andAnother input[type=text]"}
Run Code Online (Sandbox Code Playgroud)

这是预期的行为还是Selenium中的错误?我快速浏览了Selenium中的bug跟踪器,但我没有看到任何相关内容.在提出一个不需要的问题之前,我想问一下这里.另据我所知,它在IE6中不起作用但是谁在乎.我正在使用firefox进行此次运行.

小智 11

实际上两者是完全不同的选择者.

这是你的cssSelector:

div#someId.aClass.andAnother input[type=text]
Run Code Online (Sandbox Code Playgroud)

但你真正想写的是:

div#someId .aClass.andAnother input[type=text]
Run Code Online (Sandbox Code Playgroud)

注意ID和类之间的空格.你需要那个.


Bol*_*ock 8

findElement()在当前上下文中找到一个元素,这意味着您的第一段代码实际上是找到一个匹配的元素,该元素.aClass.andAnother input[type=text]包含在其中#someId.具有该ID的元素可能包含也可能不包含这两个类; WebDriver并不认为你指的是同一个元素; 它只是发现input它的祖先是#someId.aClass.andAnother.

这是完全不同于div#someId.aClass.andAnother input[type=text],其中发现的任何input[type=text]div#someId.aClass.andAnother (即它是一个div包含两个 ID和类).

  • 这个答案+1.作为完整性检查,每当您在WebDriver中遇到类似问题时,请打开浏览器的JavaScript控制台(Firebug for Firefox,F12开发人员工具用于IE,以及用于Chrome的WebKit开发人员工具)并使用相同的文档.querySelector()您的WebDriver代码中失败的选择器.如果选择器未在JavaScript控制台中返回预期元素,则可以确定它在WebDriver中永远不会返回. (5认同)