为WebDriver识别基于Angular的站点上的元素

时间:2017-12-14 13:11:49

标签: angular xpath selenium-webdriver webdriver

有一个基于Angular的网站,它不会对元素使用唯一的名称/ ID。 XPATH个元素在页面上不是永久性的,因此必须在每次网站修改后更改基于WebDriver的测试。如何在不使用XPATH的情况下管理此页面上的元素?

3 个答案:

答案 0 :(得分:2)

首先,按照Page Object pattern至少在一个地方定义定位器 - 内部页面对象。这有助于解决不断变化的用户界面。

需要考虑的其他事项:

  
      
  • 这是所有

  • 中最慢,最脆弱的定位策略   
  • 标记是   很容易变化,因此xpath定位器需要一个   很多维护

  •   
  • xpath表达式不可读且很难   调试

  •   
  • 不依赖于页面的结构或元素的相对位置
  • 避免重复定位器或定位器的某些部分 - 重复的次数越多,设计/ UI更改时需要更改的次数越多
  • 请记住像divspan这样的元素只是容器 - 在定位器中使用它们很少被证明是合理的
  • 使您的定位器可读并基于数据 - 而不是设计或布局。例如,不要使用像col-md-4col-xs-6
  • 这样的Bootstrap面向布局的类
  • 遵循这些文章中建议的一些常见最佳做法:

答案 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并不稳定,但我只是想举例说明将不同的方法串联起来以达到最终目标。