求助:无法通过Selenium选择Angular UI Grid中的行复选框
解决方案:Selenium操作Angular UI Grid行复选框
我之前在做Angular UI Grid的自动化测试时,也碰到过类似的复选框点击失效问题,给你几个亲测有效的解决方案:
通过Angular专属属性定位
你给出的元素带有ng-click="selectButtonClick(row, $event)"这个Angular绑定的属性,用它来定位最精准,不会和页面其他元素冲突。以Java为例,代码如下:// 定位第一个复选框 WebElement firstCheckbox = driver.findElement(By.cssSelector("div[ng-click='selectButtonClick(row, $event)']")); firstCheckbox.click(); // 如果要定位指定行(比如第3行),可以用xpath索引 WebElement targetRowCheckbox = driver.findElement(By.xpath("(//div[@ng-click='selectButtonClick(row, $event)'])[3]")); targetRowCheckbox.click();结合class与选中状态筛选
这个复选框的基础class是ui-grid-selection-row-header-buttons,选中时会额外加上ui-grid-row-selected类。如果需要针对性操作(比如只点击未选中的行),可以用这个特性:// 定位第一个未选中的复选框 WebElement unselectedCheckbox = driver.findElement(By.cssSelector("div.ui-grid-selection-row-header-buttons:not(.ui-grid-row-selected)")); unselectedCheckbox.click();用JavaScript强制触发点击
有时候Selenium的原生click()会因为Angular的事件绑定机制、元素层级覆盖等问题失效,这时候用JavaScript执行点击会更可靠:WebElement checkbox = driver.findElement(By.cssSelector("div.ui-grid-selection-row-header-buttons")); JavascriptExecutor jsExecutor = (JavascriptExecutor) driver; jsExecutor.executeScript("arguments[0].click();", checkbox);务必等待元素加载完成
Angular UI Grid的数据是异步加载的,直接定位很可能碰到元素未渲染的情况,一定要用显式等待确保元素可点击:WebDriverWait wait = new WebDriverWait(driver, 15); WebElement readyCheckbox = wait.until(ExpectedConditions.elementToBeClickable( By.cssSelector("div[ng-click='selectButtonClick(row, $event)']") )); readyCheckbox.click();
内容的提问来源于stack exchange,提问作者prasanth
相关产品推荐
相关产品推荐

