1

// 我想使用我自己的自定义元素而不是 selenium 定义的 web 元素 //like webElement 和 WebDriver 等。所以,我创建了以下自定义包装类:-

//custom webdriver wrapper
package org.rsf.wrapper.driver;

import org.openqa.selenium.WebDriver;

public interface RsfWebDriver extends WebDriver{

}



//custom webelement wrapper
package org.rsf.wrapper.element;

import org.openqa.selenium.WebElement;

public interface RsfElement extends WebElement{


}

//现在,我在下面的pageObject代码中调用我的包装类。但它给出了错误。请//帮助我:-

package org.rsf.pages;

import java.util.concurrent.TimeUnit;


import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.ui.Select;
import org.rsf.bean.EnterQuoteBean;
import org.rsf.utilities.Utility;
import org.rsf.wrapper.driver.RsfWebDriver;
import org.rsf.wrapper.element.RsfElement;
import org.testng.Assert;


//pageObject 
public class EnterQuotePage extends PageBase {


    public EnterQuotePage(RsfWebDriver driver) {

        super(driver);
        super.driver=driver;

    }

    //creating my custom wrapper object
    private RsfElement element;
    private static Logger log=Logger.getLogger(EnterQuotePage.class);

     Utility utilities = new Utility();
     EnterQuoteBean eqb= new EnterQuoteBean();



     public void open(String url) {
            System.out.println("Inside get url");
            System.out.println("url is : " +url);
            System.out.println(" PB : Driver value :-" + driver);
            Assert.assertNotNull(this.driver);
            this.driver.get(url);
            System.out.println("After get url");
        }




    public void clickHit()
    {
          super.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

              //ERROR OCCURS IN BELOW TWO LINES [in element]
              element=super.driver.findElement(By.id("hit"));
          element.click();
    } 




    public String getQuoteID(){

        String quoteText =findMessage.getText();
        String quoteText1[] = quoteText.split("\\=");
        quoteText1[1]=quoteText1[1].trim();
        System.out.println("Generated Quote Id :- " + quoteText1[1]);
        return quoteText1[1];
    }



    public void checkSuccessMessage(){

        String successMessage = findMessage.getText();

        Assert.assertEquals(element.getText().contains(successMessage), eqb.getSuccessMessage());

    }


    }
4

2 回答 2

0

要解决此问题,请执行以下操作

创建一个包含元素的 XML 文件并添加一个 XML 解析类,您可以轻松地在线找到 XML 解析器的代码。例如

  <Element name="ElementSource">
    <Sample>
        <ElementTagName by="Xpth,id etc..">LocaterValue</ElementTagName>
        <txtUserName by="id">username</txtUserName>
    </Sample>

创建一个具有静态网页元素的类 与 XML 文件中的相同,例如

public static final String txtUserName = "txtUserName";

您可以拥有分页类或单个类。此外,您可以在没有 XML 文件的情况下直接在此类中提及您的元素。

创建一个包含模块以读取此 XML 文件或元素类的类以获取元素定位器及其定位,例如 xpath、id 等。您可以将它们存储到变量中。

最后,创建一个名为 ElementLocater 的类,该类具有使用 Switch 案例根据其定位来定位元素的功能。例如

    public WebElement locateElement(WebDriver driver, String Locater,
            String LocateBy) {
        try {
        switch (LocateBy.toLowerCase()) {
        case "xpath":
        return driver.findElement(By.xpath(Locater));
        case "id":
        return driver.findElement(By.id(Locater));
        ....
        //So on
        default:
        return null;
        }
        } 
        catch (Exception e) 
        {
            //Write to log or custom error message
        }
        return null;
        }

您可以在此类中创建更多函数,例如 isElementPreset 等...

通过这样做,您不必在每次需要完成任何元素 HTML 更改或代码更新时进入源代码或测试。更改任何一个函数或变量都可以:)

于 2014-01-10T10:45:45.530 回答
0

您需要捕获 NoSuchElementException:

try
{
    element=super.driver.findElement(By.id("hit"));
    element.click();
}
catch (NoSuchElementException e)
{
    // Do whatever you were planning to do if the element was not found
    // (you can try again for example)
}

或者,您可以执行以下操作(将“保存”您的异常处理):

    List<WebElement> elements = super.driver.findElements(By.id("hit"));
    if (elements.size() > 0)
        elements.get(0).click();
于 2014-01-13T08:35:55.070 回答