You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium Java定位paruvendu.fr元素遇NoSuchElementError求助

解决Selenium Java定位元素失败问题(NoSuchElementError)

问题背景

我刚开始使用Selenium Java进行Web自动化操作,目标是在https://www.paruvendu.fr/网站创建二手车广告。代码执行到点击“Déposer une annonce gratuite”后,无法定位并点击“Choisissez une catégorie”元素,报错NoSuchElementError,后续也无法选择“MOTO-BATEAU”和“Used car”选项。

原代码

System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");

ChromeOptions chromeOptions = new ChromeOptions();
Map<String, Integer> timeOUts = new HashMap<>();
timeOUts.put("implicit", 1000);
chromeOptions.setCapability("timeouts", timeOUts);

WebDriver driver = new ChromeDriver(chromeOptions);
driver.manage().window().maximize();
JavascriptExecutor js = (JavascriptExecutor) driver;
driver.get("https://www.paruvendu.fr/");
js.executeScript("cmp_pv.cookie.saveConsent(false);");
driver.navigate().refresh();
driver.findElement(By.partialLinkText("Déposer une annonce gratuite")).click();     
driver.findElement(By.linkText("Choisissez une catégorie")).click();

错误信息

For documentation on this error, please visit: 
https://selenium.dev/exceptions/#no_such_element
Build info: version: '4.7.2', revision: '4d4020c3b7'
System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: 
'10.0', java.version: '11.0.16'
 Driver info: org.openqa.selenium.chrome.ChromeDriver
 Command: [7d5bbe84f8b9a235778639176345e277, findElement {using=link 
 text, value=Choisissez une catégorie}]
  Capabilities {acceptInsecureCerts: false, browserName: chrome, 
browserVersion: 109.0.5414.75, chrome: {chromedriverVersion: 109.0.5414.74 
(e7c5703604da..., userDataDir: C:\Users\hp\AppData\Local\T...}, 
goog:chromeOptions: {debuggerAddress: localhost:54474}, 
networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: 
WINDOWS, proxy: Proxy(), se:cdp: ws://localhost:54474/devtoo..., 
se:cdpVersion: 109.0.5414.75, setWindowRect: true, 
strictFileInteractability: false, timeouts: {implicit: 1000, pageLoad: 
300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, 
webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true}

解决方案

1. 替换隐式等待为显式等待

点击“Déposer une annonce gratuite”后页面会加载新内容,1秒的隐式等待不足以让元素完全渲染。使用WebDriverWait等待元素可点击,这是更可靠的方式:

// 导入必要的包
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.time.Duration;

// 替换原代码中最后两行
driver.findElement(By.partialLinkText("Déposer une annonce gratuite")).click();     
// 显式等待元素可点击,超时时间设为10秒
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Choisissez une catégorie']"))).click();

2. 修正元素定位方式

By.linkText要求元素是<a>标签且文本完全匹配,若目标元素是下拉框或按钮,改用By.xpath或By.cssSelector更灵活:

  • 用xpath模糊匹配文本:By.xpath("//*[contains(text(), 'Choisissez une catégorie')]")
  • 若元素有特定class或id,优先用这些属性定位,比如:By.cssSelector(".category-select-trigger")(需实际查看页面元素属性)

3. 优化Cookie处理逻辑

执行cookie同意脚本后刷新页面可能导致状态丢失,可尝试去掉刷新步骤,直接继续操作:

driver.get("https://www.paruvendu.fr/");
js.executeScript("cmp_pv.cookie.saveConsent(false);");
// 移除driver.navigate().refresh();
driver.findElement(By.partialLinkText("Déposer une annonce gratuite")).click();

4. 检查是否存在iframe

若目标元素嵌套在iframe中,需先切换到iframe再定位元素:

// 假设iframe有id为"main-iframe",根据实际情况修改
driver.switchTo().frame("main-iframe");
// 之后再定位元素
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Choisissez une catégorie']"))).click();
// 操作完切回主文档
driver.switchTo().defaultContent();

完整修改后代码示例

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

public class ParuvenduAdPost {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\chromedriver.exe");

        ChromeOptions chromeOptions = new ChromeOptions();
        Map<String, Integer> timeouts = new HashMap<>();
        timeouts.put("implicit", 1000);
        chromeOptions.setCapability("timeouts", timeouts);

        WebDriver driver = new ChromeDriver(chromeOptions);
        driver.manage().window().maximize();
        JavascriptExecutor js = (JavascriptExecutor) driver;

        try {
            driver.get("https://www.paruvendu.fr/");
            js.executeScript("cmp_pv.cookie.saveConsent(false);");
            
            // 点击发布免费广告
            driver.findElement(By.partialLinkText("Déposer une annonce gratuite")).click();
            
            // 显式等待并点击类别选择
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Choisissez une catégorie']"))).click();
            
            // 后续选择MOTO-BATEAU和Used car的操作,同样使用显式等待
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='MOTO-BATEAU']"))).click();
            wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[text()='Used car']"))).click();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // driver.quit(); // 按需关闭浏览器
        }
    }
}

内容的提问来源于stack exchange,提问作者BMW83

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:30:47