可以" driver.findElement"用作方法并在程序中调用

时间:2016-06-17 14:25:57

标签: selenium selenium-webdriver browser-automation

我正在使用" driver.findElement"多次。那么它可以保存在一个方法中并多次调用吗?

driver.findElement(By.xpath("//tbody[@id='detailsstockid']/tr/td[12]/a/input")).click();
driver.findElement(By.id("supplier_name")).click();
driver.findElement(By.xpath("//select[@id='supplier_name']/option[7]")).click();
driver.findElement(By.id("catagory_name")).click();
driver.findElement(By.id("productname")).sendKeys("AutoProductNew");
driver.findElement(By.id("productcode")).sendKeys("ap02");

2 个答案:

答案 0 :(得分:1)

你只需要一个这样的包装

public static WebElement findElement(By locator){

WebElement anElement = driver.findElement(locator);


return anElement;
}

findElement(By.id("id")).click();

基本上你可以调用对象可用的任何方法

答案 1 :(得分:0)

我认为你要做的是简化你的代码...也许让它更具人性化。这是一个崇高的目标,但我建议你采取不同的方法。没有更多信息,我不知道您的典型脚本是什么样的。从您提供的示例代码中,我假设您要访问几页,点击内容,填写文本框等。我建议您查看页面对象模型。

网上有很多关于这个主题的参考资料,这里有一个很好的参考资料。 http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern

基本概念是每页创建一个Class文件。 [页面并不总是意味着整个页面。例如,我将为每个弹出对话框创建一个单独的页面对象。]这使您可以将特定于该页面的所有代码合并到一个位置。如果你知道API是什么并理解它,你基本上会为你触摸的每个页面/对话框创建一个API。如果操作正确,它将极大地简化和组织您的代码,并使创建新脚本变得更加容易,并且它们将更容易阅读。好处很多......一个很重要的是代码维护变得更加容易。想象一下,你有100个脚本,都是从登录网站开始的。让我们假设登录页面的设计发生了变化......如果没有页面对象模型,则必须单独更新所有100个脚本。如果您正在使用页面对象模型,则打开LoginPage.java类,对Login()方法进行更改,然后修复所有100个脚本。

您可能会问......这是如何回答我的问题的?它的作用是转

driver.findElement(By.id("supplier_name")).click();

somePage.clickSupplierName();

在您的实际脚本中。我认为这更符合您的要求而不回答您的具体问题。 .findElement代码仍然存在,但在页面对象中“隐藏”。

一个简单的例子。我编写了一个带有支持页面对象的脚本,导航到Amazon.com,搜索星球大战,返回找到的项目数,然后导航到今天的交易页面。整个代码如下。

program.java(主脚本)

public class program
{
    public static void main(String[] args)
    {
        WebDriver driver = new FirefoxDriver();
        driver.manage().window().maximize();
        driver.get("https://www.amazon.com");

        // HOME PAGE
        HomePage homepage = new HomePage(driver);
        homepage.search("star wars");

        // SEARCH RESULTS PAGE
        SearchResultsPage searchResultsPage = new SearchResultsPage(driver);
        System.out.println(searchResultsPage.getNumberOfResults());

        // navigate to the Today's Deals page
        searchResultsPage.clickTodaysDealsLink();

        // TODAY'S DEALS PAGE
        // do more stuff

        driver.close();
        driver.quit();

        System.out.println("Done");
    }
}

HomePage.java(主页对象)

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class HomePage
{
    WebDriver driver;
    private By searchTextboxLocator = By.id("twotabsearchtextbox");

    public HomePage(WebDriver driver)
    {
        this.driver = driver;
    }

    public void search(String searchString)
    {
        driver.findElement(searchTextboxLocator).sendKeys(searchString + "\n");
    }
}

SearchResultsPage.java(搜索结果页面对象)

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

public class SearchResultsPage
{
    WebDriver driver;
    private By todaysDealsLinkLocator = By.linkText("Today's Deals");
    private By numberOfResultsLocator = By.id("s-result-count");

    public SearchResultsPage(WebDriver driver)
    {
        this.driver = driver;
    }

    public String getNumberOfResults()
    {
        // grabs only the total count of search results from the string in the form "1-16 of 7,488,146 results for "
        return driver.findElement(numberOfResultsLocator).getText().split(" ")[2];
    }

    public void clickTodaysDealsLink()
    {
        driver.findElement(todaysDealsLinkLocator).click();
    }
}