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

时间:2018-08-01 15:01:27

标签: java selenium selenium-webdriver selenium-chromedriver katalon-recorder

我是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无法满足我的所有需求。

感谢和问候

4 个答案:

答案 0 :(得分:1)

如果您所谈论的“页面”不是真正的页面过渡,但是每次按下“下一个按钮”都会动态更新同一页面,则您描述的行为可能会发生。

过去,我已经看到多个“多页”表单,它们都在同一页面上,但是根据用户所在表单的哪一部分显示或隐藏不同的“页面”。

因此,当您尝试在第二个按钮上使用第一个定位器时,它仍会定位第一个按钮,尝试与之交互,并引发异常,表明该元素不可见/无法与之交互。

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

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

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

答案 1 :(得分:0)

查询类“ next_btn”是否仅链接到该按钮,那么您知道它是该元素的可靠唯一定位器。在这种情况下,我建议您直接引用该类以获得所需的元素,就像这样……

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我尝试了一些不同的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();

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

谢谢大家。