为什么同一个按钮需要不同的元素定位器才能工作?

Why does the same button need different element locators to work?

我是 Web 自动化的新手,我想从一个简单的问题开始。

我在 Chrome 中使用 Selenium Webdriver。 我测试的每个页面上都有一个按钮:

<button class="next_btn btn green">Btn</button>

我第一次不得不编写以下语法来让它工作:

driver.findElement(By.xpath("//button[contains(.,'Btn')]")).click();

其他 xpath 不工作。下次我必须使用这个:

driver.findElement(By.xpath("//*[@id=\'formtop\']/div/form/div/fieldset[2]/div[2]/button[2]")).click();

下一页上的同一个按钮不会接受任何内容。

我试过了:

WebElement stupidBtn = driver.findElement(By.xpath("//*[@id=\'formtop\']/div/form/div/fieldset[3]/div[2]/button[2]"));
stupidBtn.click();


driver.findElement(By.xpath("//*[@id=\'formtop\']/div/form/div/fieldset[3]/div[2]/button[2]")).click();


WebElement stupidBtn = driver.findElement(By.xpath("//*[@id=\'formtop\']/div/form/div/fieldset[3]/div[2]/button[2]"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", stupidBtn);


WebElement stupidBtn = driver.findElement(By.id("//*[@id=\'formtop\']/div/form/div/fieldset[3]/div[2]/button[2]"));
Actions buildAct = new Actions(driver);
buildAct.moveToElement(stupidBtn).click(stupidBtn);
buildAct.perform();


driver.findElement(By.cssSelector("#formtop>div>form>div>fieldset:nth-child(3)>div.multiform_buttons>button.next_btn.btn.green")).click();

总的来说,我想知道我不理解的地方以及为什么我不能像在 Katalon Automation Recorder 中一样始终使用相同的语法。很遗憾,KAR 无法满足我的所有需求。

感谢和问候

查询 class "next_btn" 是否仅链接到该按钮,那么您就知道它是该元素的可靠唯一定位符。在这种情况下,我建议您直接参考 class 直接获取您要查找的元素,就像这样...

driver.findElement(By.cssSelector(".next_btn")).click();

如果您所说的 "pages" 不是真正的页面转换,但每次 "next button" 按下都会动态更新同一页面,那么您描述的行为可能会发生。

我过去曾见过多个 "multi-page" 表单都在同一页面上,但根据用户所在的表单部分显示和隐藏不同 "pages"。

因此,当您尝试在第二个按钮上使用第一个定位器时,它仍然会定位第一个,尝试与其交互,并抛出一个异常,表明该元素不是 visible/able 可以与之交互的。

过去,我基于使用 findElements 构建了解决方案,然后循环这些元素以单击当前显示的元素。

ArrayList<WebElement> elements = (ArrayList<WebElement>) driver.findElements(By.xpath("//button[contains(.,'Btn')]"));
for(WebElement element : elements) {
    if(element.isDisplayed()) {
        element.click();
    }
}

没有看到页面,我不能说这是否确实如此,但有可能。

为了能够捕捉按钮并使其正常工作,您需要在 Web 浏览器中查看 DOM 并检查您是否放置了正确的 xpath。 每个页面中的 HTML 可能与其他页面不同,这就是为什么 selenium 找不到按钮并且 Selenium 检查您的 DOM 以查看该元素,如果它存在,那么您可以使用您的按钮。

我尝试了一些不同的 xpath。例如

driver.findElement(By.xpath("//div[@id='formtop']//form[@class='multiform']/div/fieldset[3]//button[.='Weiter']")).click();

确实按下了按钮(改变了颜色),但网站没有更新(手动点击可以正常工作)。

最后这对我有用:

driver.findElement(By.xpath("//div[@id='formtop']/div/form/div/fieldset[3]/div[2]/button[2]")).click();

我不知道这里出了什么问题。也许我忘记了一些小东西或者打错了。

谢谢大家的问候。