我正在使用" 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");
答案 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();
}
}