Java WebDriver:自定义创建的web元素和驱动程序包装类中的编译错误

Java WebDriver:自定义创建的web元素和驱动程序包装类中的编译错误,java,selenium-webdriver,wrapper,pageobjects,Java,Selenium Webdriver,Wrapper,Pageobjects,//我想使用自己的自定义元素,而不是selenium定义的web元素//如webElement和WebDriver等。因此,我创建了以下自定义包装器类:- //custom webdriver wrapper package org.rsf.wrapper.driver; import org.openqa.selenium.WebDriver; public interface RsfWebDriver extends WebDriver{ } //custom webelemen

//我想使用自己的自定义元素,而不是selenium定义的web元素//如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());

    }


    }

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

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

  <Element name="ElementSource">
    <Sample>
        <ElementTagName by="Xpth,id etc..">LocaterValue</ElementTagName>
        <txtUserName by="id">username</txtUserName>
    </Sample>
您可以有分页类或单个类。另外,您可以直接在这个类中提到您的元素,而不需要XML文件

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

最后,创建一个名为ElementLocater的类,该类具有使用Switch case根据其locate来定位元素的功能。 e、 g

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


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

您需要捕获NoTouchElementException:

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 elements=super.driver.findElements(By.id(“hit”);
if(elements.size()>0)
元素。获取(0)。单击();

它说类型不匹配:无法从RsfElement转换为webelement not RsfElement…其RsfWebElementCompilation错误或运行时异常?然后我将必须实现WebDriver接口的所有方法。但是,我不想更改WebDriver提供的现有功能。只想包装它以使用我的自定义对象。然后不要扩展webdriver类,尝试在类/方法中创建webdriver对象。我在项目中所做的是创建一个驱动程序类,该类根据浏览器返回不同的webdriver实例,并提供一些附加功能。请参阅上面我的更新解决方案我想做的是将selenium定义的元素包装到我的自定义元素中,因为在我以前的项目中,我的框架在selenium RC中开发时崩溃了。在那里,我将所有默认组件直接用于我的测试用例中,所以当webdriver出现时,我必须更改所有的测试用例。我不想再重复那个错误了。根据我对您的理解,您希望在您的框架中创建一个元素存储库。这样您就不必转到每个测试类来更改元素以进行更新或巨大的代码更改。我已经在我的框架中实现了一个解决方案。请让我知道,如果我是正确的关于你的问题。更新以上的答案希望这将有帮助,任何问题请让我知道。
    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;
        }
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();