有一个基于Angular
的网站,它不会对元素使用唯一的名称/ ID。 XPATH
个元素在页面上不是永久性的,因此必须在每次网站修改后更改基于WebDriver
的测试。如何在不使用XPATH
的情况下管理此页面上的元素?
答案 0 :(得分:2)
首先,按照Page Object pattern至少在一个地方定义定位器 - 内部页面对象。这有助于解决不断变化的用户界面。
需要考虑的其他事项:
- 中最慢,最脆弱的定位策略
这是所有
标记是 很容易变化,因此xpath定位器需要一个 很多维护
xpath表达式不可读且很难 调试
div
或span
这样的元素只是容器 - 在定位器中使用它们很少被证明是合理的col-md-4
或col-xs-6
答案 1 :(得分:0)
简单的问题,简单的回答:
如果您不能使用名称/ ID并且不想使用xpath,那么在处理链接时,您只能使用 css选择器,类名,标记名和(部分)链接文本。 / p>
也许这是article helps。
答案 2 :(得分:0)
不要只依赖一种选择方法!
您可以使用任何其他findElement()选项,例如cssSelector,name,tagName等。更重要的是,您不必单独使用它们。换句话说,尽可能通过一种方法然后切换到另一种方法。这是一个从XPath开始并使用css完成的Java示例:
private final String xGrid = "//div[contains(@class,'lists-grid')]/div[contains(@class,'ui-grid')]";
private final String xGridWrapper = "/div[contains(@class,'ui-grid-contents-wrapper')]";
@FindBy(xpath = xGridScopeSubscriptions + xGridWrapper)
private List<WebElement> gridRecordList;
public void clickGridSubscriptionActionEditByRow(int row) {
int totalColumns = gridRecordList.size();
int actionColumn = getColumnIdByHeader("Action");
WebElement actionCell = gridRecordList.get((totalColumns * row) + actionColumn);
WebElement editButton = actionCell.findElement(By.cssSelector("button.subscription-edit-btn"));
editButton.click();
}
请注意,这是一种不同的大杂烩,但我希望你明白这一点。
从字符串开始,在代码中定义关键标记。连接字符串以为起始点分配WebElement变量。然后在方法中,使用起点,根据不同的选择器从那里做findElements()。
您甚至可以一次性完成所有操作。
private WebElement deleteIcon driver.findElement(By.id("name-list")).findElement(By.cssSelector("div.grid-ui div.grid-cell")).findElement(By.xpath("./td[3]/i[contains(@class,'fa-trash')]"));
我知道您说ID并不稳定,但我只是想举例说明将不同的方法串联起来以达到最终目标。