区分selenium webdriver中具有相同名称的按钮

时间:2015-03-27 11:57:47

标签: java selenium xpath webdriver


在我的应用程序中,同一页面中有两个“保存”按钮。我无法找到并单击第二个保存按钮。但两者都有不同的id值。但有时候测试仍然失败。有没有办法找到我想要点击的保存按钮。提前谢谢!

第一个保存按钮



<a id="saveNewUIPortButtonId" href="#" class="ui-commandlink btn btn-primary" onclick="PrimeFaces.ab({source:'saveNewUIPortButtonId',process:'saveNewUIPortButtonId uiPortFieldId uiHttpsPortFieldId',update:'uiPortGridId growl'});return false;">
                  <span>Save</span></a>
&#13;
&#13;
&#13;

对于第二个保存按钮

&#13;
&#13;
<a id="saveSettingsButtonId" href="#" class="ui-commandlink btn btn-primary" onclick="PrimeFaces.ab({source:'saveSettingsButtonId',process:'saveSettingsButtonId nodeNameFieldId locationLongitudeFieldId locationLatitudeFieldId hostnameFieldId dconePortFieldId systemStatusPollingIntervalFieldId systemStateItemAgeThresholdFieldId consistencyCheckRevisionQuantityFieldId consistencyCheckScheduleEnabledFieldId consistencyCheckScheduleFrequencyFieldId',update:'SystemDataPanelId growl'});return false;">
                <span>Save</span></a>
&#13;
&#13;
&#13;

我尝试用id,因为它不同。但没有运气。测试随机失败并出现错误&#34;重复发现的元素过时了#34;。

我写了下面的JaveScript来解决这个问题。如果没有单击保存按钮,有时也会失败。谁能建议我以更好的方式点击按钮?

&#13;
&#13;
JavascriptExecutor javaScriptExecutor = null;
    if (driver instanceof JavascriptExecutor) {
      javaScriptExecutor = (JavascriptExecutor) driver;      
    }    
    javaScriptExecutor.executeScript("document.getElementById('saveSettingsButtonId').click();");
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:0)

请使用以下Xpath标识相应的保存按钮。

第一个保存按钮

//a[@id='saveNewUIPortButtonId']//span

对于第二个保存按钮

//a[@id='saveSettingsButtonId']//span

答案 1 :(得分:-1)

他们可能有相同的名字&#34;但他们有不同的身份证。以下示例使用C#。 单击第一个按钮:

driver.FindElement(By.Id("saveNewUIPortButtonId").Click(); 

然后点击第二个按钮:

driver.FindElement(By.Id("saveSettingsButtonId").Click();

此外,您所描述的错误消息&#34;重复发现的元素过时了#34;很可能是由于最初定义了WebElement,然后在页面刷新/重新加载后没有重新定义。因此,如果页面在元素定义后重新加载,则需要重新定义它或直接使用上面提供的语句。

Javascript选项

以下是我在下面的评论中提到的javascript选项。 这是第一个按钮:

javaScriptExecutor.executeScript("PrimeFaces.ab({source:'saveNewUIPortButtonId',process:'saveNewUIPortButtonId uiPortFieldId uiHttpsPortFieldId',update:'uiPortGridId growl'});return false;"); 

这是第二个按钮:

javaScriptExecutor.executeScript("PrimeFaces.ab({source:'saveSettingsButtonId',process:'saveSettingsButtonId nodeNameFieldId locationLongitudeFieldId locationLatitudeFieldId hostnameFieldId dconePortFieldId systemStatusPollingIntervalFieldId systemStateItemAgeThresholdFieldId consistencyCheckRevisionQuantityFieldId consistencyCheckScheduleEnabledFieldId consistencyCheckScheduleFrequencyFieldId',update:'SystemDataPanelId growl'});return false;");

基本上复制onclick中的内容=&#34;&#34;您想要的按钮的属性,并将其作为参数粘贴到此语句,将参数括在双引号

javaScriptExecutor.executeScript();
相关问题