搜索一个字符串,然后用 Selenium 单击父 DIV

Searching for a string, then clicking the parent DIV with Selenium

我正在为我编写的 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));
}

我正在搜索的文本是 'Add Customer' 和 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')]"));

None 其中的作品...有什么建议吗?干杯!

编辑: 这是 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>

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

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

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

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

    BrowserDriver.switchTo().defaultContent();