如何用Selenium Java获取利物浦官网反馈评分按钮的ID
问题:无法定位利物浦官网反馈模态框中的评分按钮
利物浦官网首页右侧有反馈按钮,已成功打开反馈模态框,但无法获取1-10分评分按钮的ID,尝试ID、类名、XPath、CSS选择器定位均无效。
页面类代码
By acceptCookies = By.id("onetrust-accept-btn-handler"); By feedbackHomeBtn = By.id("nebula_div_btn"); By frame = By.cssSelector("iframe[id*='kampyleForm']"); By label = By.xpath("//label[contains(@class,'rating-label')][contains(.,'8')]"); By submitBtn = By.cssSelector(".panel-footer-web .submit-btn"); By closeBtn = By.cssSelector("button[aria-label='Close Survey']"); public void acceptCookies(){ try{ driver.findElement(acceptCookies).click(); }catch(Exception e){ System.out.println("Exceptions Caught" + e.getMessage()); } } public void feedbackFuncionality(){ try{ driver.findElement(feedbackHomeBtn).click(); driver.switchTo().frame(driver.findElement(frame)); driver.findElement(label).click(); driver.findElement(submitBtn).click(); driver.findElement(closeBtn).click(); driver.switchTo().defaultContent(); }catch(Exception e){ System.out.println("Exceptions Caught" + e.getMessage()); } }
测试类代码(test.java)
@BeforeTest public void beforeTest(){ WebDriverManager.chromedriver().setup(); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.get(url); } @Test public void feedbackClick() { FeedBackPage feedBackPage = new FeedBackPage(driver); try { feedBackPage.acceptCookies(); Thread.sleep(5000); feedBackPage.feedbackFuncionality(); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } @AfterTest public void afterTest(){ driver.quit(); }
定位评分按钮的方法提示
- 优化iframe切换逻辑:反馈模态框加载存在延迟,用显式等待替代固定sleep,确保iframe加载完成再切换:
WebDriverWait wait = new WebDriverWait(driver, 10); wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame)); - 直接定位radio核心元素:评分按钮通常是
input[type="radio"]绑定label,优先定位radio而非label更可靠,比如通过value属性匹配分数:By ratingBtn = By.xpath("//input[@type='radio' and @value='8']"); - 利用label关联获取ID:在浏览器开发者工具中,查看评分label的
for属性值,该值就是对应radio按钮的ID,再通过ID定位:// 先获取label的for属性 String radioId = driver.findElement(By.xpath("//label[contains(text(),'8')]")).getAttribute("for"); By ratingBtn = By.id(radioId); - 等待元素可点击:切换iframe后,显式等待评分元素可点击再执行点击操作:
wait.until(ExpectedConditions.elementToBeClickable(ratingBtn)).click();
内容的提问来源于stack exchange,提问作者loranni
相关产品推荐
相关产品推荐

