【问题标题】:How to locate or work with different locator in selemium webdrier frameowrk?如何在 selenium webdriver 框架中定位或使用不同的定位器?
【发布时间】:2015-02-12 13:51:11
【问题描述】:

我是 selenium webdriver 的初学者,我正在尝试通过阅读 excel 表来使用不同的定位器,但在这些中,它只需要一个数据通过查找定位器“id”将其放在一个字段中,当涉及到第二个文本时为此,我们通过“Xpath”使用定位器,但它没有使用。所以,我的问题是如果可能的话,我如何不使用 switch case 来使用不同的定位器。 以下是我的代码:

public class MainClass {
    private static final String BROWSER_PATH = "D:\\firefox.exe";
    private static final String TEST_SUITE_PATH = "D:\\GmailTestSuite.xls";
    private static final String OBJECT_REPOSITORY_PATH = "D:\\objectrepository.xls";
    private static final String ADDRESS_TO_TEST = "https://www.gmail.com";

    // other constants

    private WebDriver driver;
    private Properties properties;
    /*private WebElement we;*/

    public MainClass() {
        File file = new File(BROWSER_PATH);
        FirefoxBinary fb = new FirefoxBinary(file);
        driver = new FirefoxDriver(fb, new FirefoxProfile());
        driver.get(ADDRESS_TO_TEST);
    }

    public static void main(String[] args) throws IOException, BiffException {
        MainClass main = new MainClass();

        main.handleTestSuite();
    }

    private void handleTestSuite() throws BiffException, IOException {
        ReadPropertyFile readConfigFile = new ReadPropertyFile();
        properties = readConfigFile.loadPropertiess();

        ExcelHandler testSuite = new ExcelHandler(TEST_SUITE_PATH, "Suite");
        testSuite.columnData();

        int rowCount = testSuite.rowCount();
        System.out.println("Total Rows=" + rowCount);

        for (int i = 1; i < rowCount; i++) {
            String executable = testSuite.readCell(testSuite.getCell("Executable"), i);
            System.out.println("Executable=" + executable);

            if (executable.equalsIgnoreCase("y")) {
                // exe. the process
                String scenarioName = testSuite.readCell(testSuite.getCell("TestScenario"), i);
                System.out.println("Scenario Name=" + scenarioName);
                handleScenario(scenarioName);
            }
        }
    }

    private void handleScenario(String scenarioName) throws BiffException, IOException {
        ExcelHandler testScenarios = new ExcelHandler(TEST_SUITE_PATH);
        testScenarios.setSheetName("Login");
        testScenarios.columnData();
        int rowWorkBook1 = testScenarios.rowCount();
        for (int j = 1; j < rowWorkBook1; j++) {
            String framWork = testScenarios.readCell(testScenarios.getCell("FrameworkName"), j);
            String operation = testScenarios.readCell(testScenarios.getCell("Operation"), j); // SendKey
            String value = testScenarios.readCell(testScenarios.getCell("Value"), j);
            System.out.println("FRMNameKK=" + framWork + ",Operation=" + operation +
                               ",Value=" + value);

            handleObjects(operation,value,framWork);
        }
    }

    private void handleObjects(String operation,String value,String framWork) throws BiffException, IOException 
    {
        System.out.println("HandleObject--> "+framWork);
        ExcelHandler objectRepository = new ExcelHandler(OBJECT_REPOSITORY_PATH, "OR");
        objectRepository.columnData();
        int rowCount = objectRepository.rowCount();
        System.out.println("Total Rows in hadleObject=" + rowCount);

        for (int k = 1; k < rowCount; k++) {
            String frameWorkName = objectRepository.readCell(objectRepository.getCell("FrameworkName"), k);
            String ObjectName = objectRepository.readCell(objectRepository.getCell("ObjectName"), k);
            String Locator = objectRepository.readCell(objectRepository.getCell("Locator"), k); // SendKey

            System.out.println("FrameWorkNameV=" + frameWorkName +
                               ",ObjectName=" + ObjectName + ",Locator=" + Locator);


            if(framWork.equalsIgnoreCase(frameWorkName))
            {   
                    operateWebDriver(operation,Locator,value,ObjectName);

            }       
        }
    }

    private void operateWebDriver(String operation,String Locator,String value, String objectName) 
    {
        System.out.println("Operation execution in progress");
        WebElement temp=getElement(Locator,objectName);
        if (operation.equalsIgnoreCase("SendKey")) 
        {                   
            temp.sendKeys(value);            
        } 
        if (operation.equalsIgnoreCase("Click")) 
        {        
            temp.click();            
        }
    }


    public WebElement getElement(String locator,String objectName)
    {
        WebElement temp = null;
        if(locator.equalsIgnoreCase("id"))
        {
            temp = driver.findElement(By.id(objectName));
        }else if(locator.equalsIgnoreCase("xpath")) {

            temp = driver.findElement(By.xpath(objectName)); 
        }       
        if(locator.equalsIgnoreCase("link"))
        {

        }
        return temp;
    }

} 

【问题讨论】:

  • 不清楚到底是什么问题。您是否需要摆脱 getElement 方法中的 if else 结构?或者 xpath 定位器在您的 getElement 方法中不起作用?
  • @ShaikhMohammedShariq 实际上,使用此代码我可以获取所有定位器,但是当我运行程序时,它获取定位器“id”的值并将该值放入文本字​​段但不获取其他定位器值.那么,我想知道如何同时使用不同的定位器?
  • 因此您无法运行不同类型的定位器。您是否检查过是否能够从属性文件中正确读取它,甚至是否在属性文件中正确配置了它?您能否打印在 handleScenario()handleObjects() 方法中检索到的值,以检查您是否从属性文件中正确获取定位器值?
  • @ShaikhMohammedShariq 是的,我能够正确阅读工作簿,并且在 handleScenario() 中获得 value=(id=37),在 handleObjects() 中获得“操作” value=(id=40) , "value" value=(id=42), 框架它得到 value=(id=44)。
  • @ShaikhMohammedShariq 等待您的回复。

标签: java excel selenium


【解决方案1】:

你需要反射。请参阅以下 2 种方法中的示例:

import java.lang.reflect.Method;
...
@Test
public void TestAmazon() {
    driver = new ChromeDriver();
    driver.navigate().to("http://www.amazon.com");

    String locatorType = "id";
    String locatorExpression = "twotabsearchtextbox";           

    By locator = createLocator(locatorType, locatorExpression);                 
    WebElement textbox = driver.findElement(locator);
    textbox.sendKeys("Star Wars: The Digital Movie Collection");
    textbox.sendKeys(Keys.ENTER);

    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    locatorType = "className";
    locatorExpression = "nav-logo-link";
    locator = createLocator(locatorType, locatorExpression);    
    driver.findElement(locator).click();
}


private By createLocator(String locatorType, final String locatorExpression) {
    By locator = null;
    Class<By> byClass = By.class;
    Class[] argTypes = new Class[] { String.class };
    try {
        Method m = byClass.getDeclaredMethod(locatorType, argTypes);

        try {
            locator = (By)m.invoke(null,locatorExpression);
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return locator;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多