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

Differentiate Buttons which have the same name in selenium 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>

对于第二个保存按钮

<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>

我尝试使用 id,因为它不同。但没有运气。测试随机失败并出现错误 "Element being found repeatedly went stale".

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

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

请使用下面的 Xpath 来识别相应的 保存 按钮。

第一个保存按钮

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

对于第二个保存按钮

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

他们可能有相同的 "name" 但他们有不同的 ID。下面的示例使用 C#。 点击第一个按钮:

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

然后点击第二个按钮:

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

另外,您描述为 "Element being found repeatedly went stale" 的错误消息很可能是由于 WebElement 最初被定义,然后在页面 refresh/reload 之后没有被重新定义。因此,如果在定义元素后页面重新加载,您将需要重新定义它或直接使用我上面提供的语句。

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="" 属性中的内容并将其作为参数粘贴到此语句中,将参数括在双引号中

javaScriptExecutor.executeScript();