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

如何在Selenium+Java中获取YouTube视频时长?解决元素定位异常

解决Selenium+Java获取YouTube首页首个视频时长的元素定位问题

你的问题出在元素定位的XPath过于宽泛,(//span[@id='text'])[1]会匹配页面上第一个id为text的span元素,而这个元素大概率不是视频时长的目标元素,因此抛出NoSuchElementException。结合你提供的截图,视频时长元素属于对应视频项的缩略图overlay容器,需要更精准的定位规则。

修复步骤:

  1. 使用精准的XPath定位时长元素
    针对YouTube首页的视频结构,首个视频的时长元素可以通过以下XPath定位(利用视频项的层级关系缩小范围):

    (//ytd-rich-grid-media//span[@id='text'])[1]
    

    或者更严谨的版本(通过aria-label属性过滤时长元素):

    (//ytd-rich-item-renderer//span[@id='text' and contains(@aria-label, '时长')])[1]
    
  2. 等待元素可见而非可点击
    时长元素是静态显示的文本,无需等待可点击状态,改用visibilityOfElementLocated等待元素渲染完成,避免因元素未加载导致的定位失败。

修改后的代码片段:

// 替换原有的获取时长代码
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//ytd-rich-grid-media//span[@id='text'])[1]")));
String firstVideoLength = webDriver.findElement(By.xpath("(//ytd-rich-grid-media//span[@id='text'])[1]")).getText();
System.out.println(firstVideoLength);

完整测试方法(整合修复后):

@Test
public void Task4Test(){
    DriverFactory driverFactory = new DriverFactory();
    WebDriver webDriver = driverFactory.initDriver();
    webDriver.get("https://www.youtube.com/");
    
    // 处理Cookie弹窗(注意:文本为波兰语,若页面语言变化需对应调整)
    webDriver.findElement(By.xpath("//*[@id='button']//*[contains(text(), 'Zaakceptuj wszystko')]")).click();
    
    WebDriverWait wait = new WebDriverWait(webDriver, 30);
    
    // 获取首个视频标题
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//*[@id='video-title'])[1]")));
    String firstVideoTitle = webDriver.findElement(By.xpath("(//*[@id='video-title'])[1]")).getText();
    System.out.println(firstVideoTitle);
    
    // 获取首个视频频道名
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("(//ytd-channel-name[@id='channel-name']/div/div/yt-formatted-string/a)[1]")));
    String firstVideoChannel = webDriver.findElement(By.xpath("(//ytd-channel-name[@id='channel-name']/div/div/yt-formatted-string/a)[1]")).getText();
    System.out.println(firstVideoChannel);
    
    // 获取首个视频时长(修复部分)
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("(//ytd-rich-grid-media//span[@id='text'])[1]")));
    String firstVideoLength = webDriver.findElement(By.xpath("(//ytd-rich-grid-media//span[@id='text'])[1]")).getText();
    System.out.println(firstVideoLength);
    
    // 关闭驱动
    webDriver.quit();
}

补充说明:

  • YouTube页面结构可能随版本更新调整,若后续再次出现定位问题,需重新检查元素层级关系并调整XPath。
  • Cookie弹窗的文本Zaakceptuj wszystko为波兰语“接受全部”,若测试环境语言变更,需对应修改该文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:54:18