【问题标题】:InvalidSelectorError: Compound class names not permittedInvalidSelectorError:不允许复合类名
【发布时间】:2015-04-15 14:44:54
【问题描述】:

我正在尝试使用

获取以下每个元素
element = driver.findElement(By.className("code-list-item code-list-item-public "));

inspect元素的输出如下。

<div class="column one-fourth codesearch-aside"></div>

<div class="column three-fourths codesearch-results">

    <div class="sort-bar"></div>
    <div id="code_search_results">
        <div class="code-list">
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
            <div class="code-list-item code-list-item-public "></div>
        </div>

但它失败并引发以下错误。

Caused by: org.openqa.selenium.InvalidSelectorException: The given selector code-list-item code-list-item-public  is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError: Compound class names not permitted
For documentation on this error, please visit: http://seleniumhq.org/exceptions/invalid_selector_exception.html

另外,我如何遍历每个类?其中每一个都包含子部分,我想在移至下一个之前单独进一步处理。

【问题讨论】:

  • 看看this question的答案
  • 所以,当我尝试这个时, element = driver.findElement(By.className("code-list-item"));它可以工作,但是当我尝试使用“code-list-item code-list-item-public”时它不起作用。
  • 可能是因为By.className(...) 不接受多个类名,如果需要,请使用我之前建议的方法或尝试用, 分隔类名
  • @Zack 错误告诉你到底发生了什么。这是一个复合类,您使用 code-list-item code-list-item-public 两个不同类的组合,当您使用 code-list-item 时,它只是一个类,因为它也是独一无二的,它可以工作

标签: java selenium xpath selenium-webdriver web-scraping


【解决方案1】:

如果我不需要,我不会那么担心类名。我会使用 css 选择器。

.code-list&gt;div

css 中的通知. 表示类,所以我指向类为code-list 和&gt;div 的div,它允许我们选择所有子div

您也可以使用:nth-child() 函数来获取具有索引号的特定子div

.code-list&gt;div:nth-child(1)

上面的css可以让你选择第一个子div

根据你的截图

.code-list&gt;div:nth-child(1)&gt;a

一个可以帮助 OP 理解如何处理这种情况的代码块

//maximizing the window for better view
driver.manage().window().maximize();

//a selector to find all the links on the page
By selector = By.xpath("//p[@class='title']/a[1]");

//finding the list of all elements
List<WebElement> list = driver.findElements(selector);

/*Iterating over the collection may throw StaleElementReference exception due to DOM refresh
according to my knowledge for loop is best in such case
*/
for (int i = 0; i<list.size(); i++){

    new WebDriverWait(driver,10).until(ExpectedConditions.elementToBeClickable(selector));

    //Click on the title
    driver.findElements(selector).get(i).click();

    //Navigating back to the main page. This is not feasible but no other option present due to page structure
    driver.navigate().back();
}

【讨论】:

    猜你喜欢
    • 2020-11-04
    • 2015-11-09
    • 2018-05-19
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2016-10-12
    相关资源
    最近更新 更多