如何使用Java+Selenium WebDriver向Swiggy网站搜索框传值
Swiggy网站自动化测试搜索框传值方案
对应页面元素参考截图:
之前定位、传值失败的核心原因
- className定位天生不可靠:Swiggy前端类名是构建阶段生成的动态哈希值,版本迭代后就会变更,完全不适合作为定位依据,定位失败是必然结果
- 直接定位后立刻执行输入会触发异常:Swiggy首页采用异步渲染逻辑,
findElement能拿到元素节点时,元素还没完成交互逻辑绑定,处于不可输入状态 - 首屏加载的定位弹窗、优惠弹窗会生成遮罩层盖在搜索框上方,直接操作会命中遮罩而非输入框
正确实现逻辑
你之前写的基于placeholder的cssSelector定位逻辑是对的,只要补上显式等待、交互前校验的逻辑就能正常传值,步骤如下:
- 初始化显式等待实例,设置合理的超时时间,不要写固定时长的
sleep等待 - 等待搜索框进入可点击状态后再获取元素实例,确保元素已经完成渲染、可交互
- 输入内容前先清空输入框可能存在的默认值、历史缓存内容
- 执行输入传值操作
参考代码
import org.openqa.selenium.WebElement; import org.openqa.selenium.By; 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)); // 等待搜索框可交互后定位元素 WebElement searchBox = wait.until( ExpectedConditions.elementToBeClickable( By.cssSelector("input[placeholder='Search for restaurants and food']") ) ); // 清空输入框残留内容 searchBox.clear(); // 传入目标搜索值 searchBox.sendKeys("披萨");
备用定位方案
如果遇到站点区域化配置导致placeholder文案变动,可以用搜索容器层级定位的方式,表达式参考:
By searchBoxLocator = By.cssSelector("div[class*='SearchContainer'] input[type='text']");
调试提示:如果运行时提示找不到元素,先手动确认当前打开的Swiggy站点是否已经选择了对应配送城市,未选城市的首页搜索框属性会有差异。
内容的提问来源于stack exchange,提问作者Deepak chopra
相关产品推荐
相关产品推荐

