如何用Selenium/Java定位页面上的指定提交按钮元素?
如何用Selenium/Java定位页面上的指定提交按钮元素?
我看你在LinkedIn登录页定位那个「Sign in」提交按钮时碰了壁,明明用户名、密码框都能找到,唯独这个按钮拿不到,太闹心了!咱们来拆解下问题,再给你几个靠谱的解决办法。
首先得说你原来代码里的核心问题:你用的By.xpath("//input[@type='submit']")找的是input标签的提交元素,但目标按钮其实是<button>标签,这就难怪找不到、返回null啦!
咱们先盯准目标按钮的属性:它有几个非常独特的专属标识,比如data-litms-control-urn="login-submit"、aria-label="Sign in",这些属性在页面里基本不会重复,用来定位准没错。下面给你几种实用的定位方式,都是Java代码:
方法1:用唯一的data属性定位(最推荐)
这个data-litms-control-urn是LinkedIn专门给登录按钮加的标识,唯一性拉满,用它定位最稳:
// XPath写法 WebElement submit = webDriver.findElement(By.xpath("//button[@data-litms-control-urn='login-submit']")); // 或者CSS选择器写法,速度更快 WebElement submit = webDriver.findElement(By.cssSelector("button[data-litms-control-urn='login-submit']"));
方法2:用aria-label属性定位
这个属性是给无障碍访问设计的,也是唯一的,同样靠谱:
// XPath写法 WebElement submit = webDriver.findElement(By.xpath("//button[@aria-label='Sign in']")); // CSS选择器写法 WebElement submit = webDriver.findElement(By.cssSelector("button[aria-label='Sign in']"));
方法3:结合class和type定位(适合无唯一属性的兜底方案)
如果上面的属性万一有变动,还可以结合它的class和type属性定位,注意class里的空格要转成CSS的类选择器格式:
// CSS选择器写法(推荐) WebElement submit = webDriver.findElement(By.cssSelector("button.btn__primary--large.from__button--floating[type='submit']")); // XPath写法,用contains匹配多class WebElement submit = webDriver.findElement(By.xpath("//button[contains(@class,'btn__primary--large') and contains(@class,'from__button--floating') and @type='submit']"));
额外提醒:别用Thread.sleep,改用显式等待
你代码里的Thread.sleep(4000)太死板了,万一页面加载慢了就会失效,换成Selenium的显式等待会更稳定,比如:
// 先导入必要的类:org.openqa.selenium.support.ui.WebDriverWait; org.openqa.selenium.support.ui.ExpectedConditions; WebDriverWait wait = new WebDriverWait(webDriver, 10); // 最多等待10秒 // 等待按钮可点击后再执行点击 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@data-litms-control-urn='login-submit']"))).click();
最后给你整合后的完整代码示例:
webDriver.manage().window().maximize(); webDriver.get("https://www.linkedin.com/login?fromSignIn=false&trk=guest_homepage-basic_nav-header-signin"); // 用显式等待替代Thread.sleep,更稳定 WebDriverWait wait = new WebDriverWait(webDriver, 10); WebElement username = wait.until(ExpectedConditions.visibilityOfElementLocated(By.name("session_key"))); WebElement password = wait.until(ExpectedConditions.visibilityOfElementLocated(By.name("session_password"))); username.sendKeys("xxxxxx"); password.sendKeys("xxxxxx"); // 定位并点击提交按钮 wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[@data-litms-control-urn='login-submit']"))).click();
这样改完应该就能稳稳定位到那个提交按钮啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

