你如何在 selenium 中选择 id 中有句点的元素?

Eso*_*nse 3 selenium webdriver css-selectors selenium-webdriver

我正在尝试编写代码来选择 HTML 下拉菜单的所有选项。我已经编写了以下我认为应该可以工作的代码。

public void testSelectMultipleOptions () {
    // code to get to report page
    selectAllOptions("param.Status");
    // code to run report and switch to the result page
}

public void selectAllOptions(String htmlID) {
    List<WebElement> options = selenium.findElements(By.cssSelector("select#"+htmlID+" > option"));
    for(WebElement option: options) {
        option.click();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,下拉列表中没有选择任何选项。我相信我遇到的问题是由于我有一个 HTML 元素在 id 中带有句点,但我无法更改页面的底层 HTML 代码。

Arr*_*ran 5

非常糟糕的开发实践。我知道你没有能力改变它,但如果你能,指出它非常非常糟糕。为什么?两个原因。

在 CSS 中,基于类的规则通常以句点开头。

在 CSS 选择器框架中,包括 jQuery/Sizzle 和 Selenium 在这个例子中所做的,句号有一个特殊的含义——主要是根据很多规则来选择元素。这就是它在这里绊倒的原因——如果你直接在 Chrome 或 Firebug 中运行 CSS 选择器,你会看到同样的事情——它也会失败。

在元素的 ID 中使用句点与这一切背道而驰。令人讨厌的是,HTML 规范允许这样做。

无论如何,一切都没有丢失,有很多方法可以解决。

首先,你可以逃避它:

select#param\\.Status
Run Code Online (Sandbox Code Playgroud)

其次,您可以使用稍微复杂一点的选择器:

select[id='param.Status']
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用 XPath:

//select[@id='param.Status']
Run Code Online (Sandbox Code Playgroud)