搜索字符串,然后单击Selenium的父DIV

时间:2016-04-05 09:33:35

标签: java selenium xpath cucumber

我正在为我编写的RIA进行一些测试自动化,当我尝试在DOM中搜索给定的字符串,然后单击封装所述字符串的DIV时,我遇到了一些麻烦。我正在用黄瓜硒。

我的测试结构如下:

├── app
│   ├── containers
│   │   ├── AddCustomerContainer.java
│   │   ├── HomePageContainer.java
│   │   ├── LoginErrorPageContainer.java
│   │   └── LoginPageContainer.java
│   ├── NaviagtorFactory.java
│   ├── Navigation.java
│   ├── User.java
│   ├── Users.java
│   └── view
│       ├── AddCustomerView.java
│       ├── HomeView.java
│       ├── LoginErrorView.java
│       └── LoginView.java
├── constants
│   ├── Browsers.java
│   ├── CredentialsType.java
│   └── Outcome.java
└── utils
    ├── BrowserDriver.java
    ├── BrowserFactory.java
    └── FileUtils.java

测试是从Navigation.java运行的,这就是我尝试搜索字符串然后点击它的父节点的方式:

//Navigation.java    
public void given_I_navigate_to_the_add_customer_page(){
        BrowserDriver.loadPage("localhost:3000");
        AddCustomerView.clickAddCustomer();
    }

然后在AddCustomerView.java中:

private static final AddCustomerContainer addCustomerContainer = PageFactory.initElements(BrowserDriver.getCurrentDriver(), AddCustomerContainer.class);

public static void clickAddCustomer(){
    LOGGER.info("Navigating to Add Customer");
    addCustomerContainer.getAddCustomerButton().click();
}

AddCustomerContainer.java:

@FindBy(how = How.XPATH, using = "//*")
    public WebElement all;

public WebElement getAddCustomerButton(){
    WebElement button = BrowserDriver.getText(all, "Add customer");
    return button;
}

这是BrowserDriver.java中的getText函数

public static WebElement getText(WebElement element, String value) {
    return element.findElement(By.partialLinkText(value));
}

我正在搜索的文字是“添加客户”和XPATH // *但是当测试运行selenium时,似乎找不到字符串。

在结构和驱动程序设置方面,一切正常,因为我正在运行其他几个按预期运行的测试。然而,找到一个字符串有点谜。

我尝试了几种获取字符串的方法:

return element.findElement(By.linkText("Add customer"));
return element.findElement(By.partialLinkText("Add customer"));
return element.findElement(By.xpath("//*[contains(text(),'Add customer')]"));

这些都不起作用......有什么建议吗?干杯!

编辑: 这是HTML,值得一提的是,它出现在一个框架中,但是我用chrome来获取xpath,它是//*[@id="login-success"]/p[1]/a[2]

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
OATime
</title>
<link href="style.css" rel="stylesheet" type="text/css">
<meta http-equiv="refresh" content="30">

<style type="text/css"></style></head>

<body id="login-success" class="chooser">
<br>
<p align="center">
<strong>version_TOKEN</strong>
<br>
<br>
<a target="main" href="/customer-list" class="screenlink">List customers</a><br>
<a target="main" href="/customer-edit" class="screenlink">Add customer</a><br>
<br>
<a target="_top" href="/logout" class="screenlink">Sign out</a>
</p>
</p>
</body></html>

1 个答案:

答案 0 :(得分:1)

使用selenium,您需要在目标元素所在的框架上设置上下文。所以在你的情况下它应该是这样的:

each

在完成框架后,设置回默认上下文:

@FindBy(how = How.XPATH, using = "//*")
public WebElement all;

public WebElement getAddCustomerButton(){
    BrowserDriver.switchTo().frame(0);
    WebElement button = BrowserDriver.getText(all, "Add customer");
    return button;
}