解决Selenium自动化测试无法点击Google搜索按钮的问题
问题
开发自动化测试套件时,最初的测试用例连首行元素定位代码(如driver.findElement(By.id("username")).sendKeys("example");)都执行失败。为排查问题,编写了Google搜索的Java Selenium测试代码:配置ChromeDriver路径后打开谷歌首页,最大化窗口,向搜索框输入“fruit”后尝试点击搜索按钮,测试失败。报错为org.openqa.selenium.NoSuchElementException,提示无法定位name为“ntnK”的元素。尝试修改定位方式(id、classname等)仍未解决,期望实现点击搜索按钮并正常关闭ChromeDriver的功能。
测试代码
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class fgiLogin { public static void main(String[] args) throws InterruptedException { System.setProperty("webDriver.chrome.driver", "C:\\Users\\examplefolder\\Documents\\examplefolder\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://google.com"); driver.manage().window().maximize(); Thread.sleep(5000); driver.findElement(By.className("gLFyf")).sendKeys("fruit"); driver.findElement(By.name("ntnK")).click(); driver.close(); } }
报错信息
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. Starting ChromeDriver 110.0.5481.77 (65ed616c6e8ee3fe0ad64fe83796c020644d42af-refs/branch-heads/5481@{#839}) on port 10097 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully. [1677870261.213][WARNING]: virtual void DevToolsClientImpl::AddListener(DevToolsEventListener *) subscribing a listener to the already connected DevToolsClient. Connection notification will not arrive. Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"*[name='ntnK']"} (Session info: chrome=110.0.5481.178) For documentation on this error, please visit: https://selenium.dev/exceptions/#no_such_element Build info: version: '4.8.1', revision: '8ebccac989' System info: os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '19.0.2' Driver info: org.openqa.selenium.chrome.ChromeDriver Command: [2937306020c9aa7bccf03e80ec05305a, findElement {using=name, value=ntnK}] Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 110.0.5481.178, chrome: {chromedriverVersion: 110.0.5481.77 (65ed616c6e8e..., userDataDir: C:\Users\ne1723\AppData\Loc...}, goog:chromeOptions: {debuggerAddress: localhost:50557}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: WINDOWS, proxy: Proxy(), se:cdp: ws://localhost:50557/devtoo..., se:cdpVersion: 110.0.5481.178, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true} Session ID: 2937306020c9aa7bccf03e80ec05305a at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:67) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:484) at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200) at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133) at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:53) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:184) at org.openqa.selenium.remote.service.DriverCommandExecutor.invokeExecute(DriverCommandExecutor.java:167) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:142) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:543) at org.openqa.selenium.remote.ElementLocation$ElementFinder$2.findElement(ElementLocation.java:162) at org.openqa.selenium.remote.ElementLocation.findElement(ElementLocation.java:66) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:352) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:344) at fgiLogin.main(fgiLogin.java:20) Process finished with exit code 1
解决方案
1. 修正搜索按钮的元素定位
Google搜索按钮的name属性ntnK是动态生成的,每次刷新都会变化,所以定位失败。换成以下稳定的定位方式:
- 通过
name="btnK"定位标准搜索按钮 - 通过XPath定位:
//input[@value='Google 搜索'](根据按钮文本匹配) - 通过CSS选择器定位:
input[type='submit'][name='btnK']
2. 用显式等待替代Thread.sleep()
固定时长的Thread.sleep()很容易因页面加载慢导致元素未就绪,改用Selenium的显式等待,确保元素可交互后再操作:
import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; import java.time.Duration; // 等待10秒,直到元素可点击 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.elementToBeClickable(By.className("gLFyf"))).sendKeys("fruit"); wait.until(ExpectedConditions.elementToBeClickable(By.name("btnK"))).click();
3. 正确关闭ChromeDriver
用driver.quit()替代driver.close(),quit()会关闭所有关联窗口并终止驱动进程,避免残留后台进程。
完整修正后的代码
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; import java.time.Duration; public class fgiLogin { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Users\\examplefolder\\Documents\\examplefolder\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.get("https://google.com"); driver.manage().window().maximize(); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 输入搜索内容 wait.until(ExpectedConditions.elementToBeClickable(By.className("gLFyf"))).sendKeys("fruit"); // 点击搜索按钮 wait.until(ExpectedConditions.elementToBeClickable(By.name("btnK"))).click(); // 关闭浏览器并终止驱动 driver.quit(); } }
额外注意事项
- 确保ChromeDriver版本与Chrome浏览器版本严格匹配,版本不兼容会引发驱动启动或元素定位问题
- 原代码中系统属性名写错了:应该是
webdriver.chrome.driver,不是webDriver.chrome.driver,大小写错误也会导致驱动加载失败
内容的提问来源于stack exchange,提问作者jetswept
相关产品推荐
相关产品推荐

