【问题标题】:Why does the same button need different element locators to work?为什么同一个按钮需要不同的元素定位器才能工作?
【发布时间】:2018-08-01 15:01:26
【问题描述】:

我是 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 自动化记录器中相同的语法。不幸的是,KAR 无法满足我的所有需求。

感谢和问候

【问题讨论】:

  • 可以给我们网址吗?
  • 您无法找到的所有按钮都可能位于 iframe 中。如果您说每个按钮的 HTML 代码都是相同的,并且您能够找到第一个,那么这很可能是罪魁祸首。
  • @Rajagopalan whats2doo.com/en 我目前正在测试 Helper 和 ToDo 设置。你需要一个帐户。谢谢和问候

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


【解决方案1】:

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

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

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

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

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

没有看到页面我不能说这是否绝对是这种情况,但这是一种可能性。

【讨论】:

  • 您好,非常感谢。你是完全正确的。这些按钮具有相同的类,但位于不同的字段集中。不幸的是,您的智能解决方案也不起作用。我忘了说些什么。在按下按钮之前,我在 jquery 日历中选择了一个日期。这很好用,我尝试在调用按钮之前不与日历交互。没有改变。但现在我有一些想法要测试。再次感谢和问候
【解决方案2】:

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

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

【讨论】:

  • 您好,谢谢。这也不起作用。它绝对是一个可靠的独特定位器。我想知道一个事实,即我不能每次都使用相同的定位器。我忘了说些什么。在按下按钮之前,我在 jquery 日历中选择了一个日期。这很好用,我在调用按钮之前尝试处理以下两件事:driver.switchTo().window("WindowName"); driver.manage().timeouts().implicitlyWait(3000, TimeUnit.SECONDS);问候
【解决方案3】:

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

【讨论】:

  • 您好,谢谢。我正在使用cropath、ranorex selocity、xpath helper 和sideex 进行寻路。而且我总是认为元素是一对一的。我那里有什么问题还是有更好的方法/工具?问候
【解决方案4】:

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

我不知道这里出了什么问题。可能是我忘记了什么小东西,或者有错别字。

谢谢大家和问候。

【讨论】:

    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 2018-10-15
    • 2019-05-18
    相关资源
    最近更新 更多