区分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();
在我的应用程序中,同一页面中有两个保存按钮。我找不到并单击第二个保存按钮。但是两者都有不同的 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();