当前位置: 首页 > 知识库问答 >
问题:

JavaSelenium自定义方法获取webelement的名称作为参数

伯彦君
2023-03-14

在我的项目中使用JavaSelenium和Page Object,想要创建一个自定义方法,将两个字符串作为参数,组合它们并调用右webelement来执行一些操作。

下面的例子我的页面对象

public class Test extends Base {

public Test() {
    PageFactory.initElements(driver, this);
}


@FindBy(xpath = "//div[@id='question1No']")
WebElement question1Yes;

@FindBy(xpath = "//div[@id='question1No']")
WebElement question1No;


public Object GetField(String answer, String question) {
    Field field = null;
    try {
        field = Test.class.getField((question+answer).replace("\"", ""));
        return field.get(this);
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

public void answerQuestion(String answer, String question) {    
    WebElement element = (WebElement)GetField(answer,question);
    element.click();

}

例如,调用该方法:

answerQuestion("Yes", "question1")

调用此方法应执行click on question1Yes元素。

共有2个答案

陆城
2023-03-14

添加到上面的答案更新它根据操作需要以及包名称

import java.lang.reflect.Field;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class Test extends base{

    @FindBy(xpath = "//div[@id='question1No']")
    public WebElement question1Yes;

    @FindBy(xpath = "//div[@id='question1No']")
    public WebElement question1No;

    public Test() {
        PageFactory.initElements(driver, this);
    }

    public void answerQuestion(String answer, String question) {
        WebElement temp = null;
        try {               
            Field field = Test.class.getField(question + answer);
            temp = (WebElement) field.get(this);
            temp.click();

        } catch (Exception e) {
            // Handle the exception here when there is wrong field
            // throws NoSuchFieldException, SecurityException
            e.printStackTrace();
        }
    }
}

还可以使用常用方法获取字段

public Object GetField(String answer, String question) {
        Field field = null;
        try {
            field = Test.class.getField(question + answer);
            return field.get(this);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

这样你的代码就会

import java.lang.reflect.Field;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class Test extends base {

    @FindBy(xpath = "//div[@id='question1No']")
    public WebElement question1Yes;

    @FindBy(xpath = "//div[@id='question1No']")
    public WebElement question1No;

    public Test() {
        PageFactory.initElements(driver, this);
    }

    public void answerQuestion(String answer, String question) {    
         WebElement temp = (WebElement)GetField(answer,question);
         temp.click();  
    }

    public Object GetField(String answer, String question) {
        Field field = null;
        try {
            field = Test.class.getField(question + answer);
            return field.get(this);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
濮俭
2023-03-14

你可以使用反射

Field field = Test.class.getField("question1Yes");
WebElement element = (WebElement) field.get(this);

然后你可以用你的网页元素做任何你想做的事

upd。如果字段是私有的,则写入字段。setAccessible(真)

 类似资料:
  • 问题内容: 在 Java 6中 ,假设我具有以下方法签名: 我想知道在运行时传递给任何其他参数的值,这里重要的一点是我想通过参数名称获取该值。 我知道如何使用或获取参数类型的列表。 理想情况下,我想获取参数 名称 而不是类型的列表。有办法吗? 问题答案: 如果您告诉编译器将其包括在内,则可以使用参数名称(使用调试信息进行编译)。Spring 可以帮助您获取名称。该默认实现使用ASM 这样做。 与您

  • 问题内容: 给定以下Go方法: 我想反映参数的名称(在这里)。 我尝试了以下操作,但是它返回了结构名称(在这里): 如何获得参数名称? 问题答案: 无法获取方法或函数的参数名称。 这样做的原因是因为名称对于调用方法或函数的人并不是很重要。重要的是参数的类型及其顺序。 甲功能类型表示集合的具有相同参数和结果类型的所有功能。无论参数名称如何,具有相同参数和结果类型的2个函数的类型均相同。以下代码显示:

  • 问题内容: 鉴于函数: 如何提取参数的数量和名称。即,鉴于我有提及func,因此我希望返回。 为此的使用场景是,我有一个装饰器,并且希望以与实际函数作为键一样的顺序使用方法参数。即,我打电话时装饰器的外观如何? 问题答案: 看一下模块-这将为你检查各种代码对象属性。 其他结果是 args和* kwargs变量的名称,以及提供的默认值。即。 请注意,在某些Python实现中,某些可调用对象可能不是自

  • 我使用的是selenium pagefactory,并引入了一个注释@Name(Description=“Username”),用于所有WebElement。稍后,我需要在自定义方法中找到描述值,以便进行报告,例如: 我的@Name注释界面和pagefactory如下所示: 名称接口 在使用反射时,我面临的问题是需要定义pagefactory的类名,并提供字段名作为字符串“username”,以检

  • 我有一个简单的测试套件(对这个例子来说非常简单)。我在构造函数上使用@Factory表示法和一个@DataProvider,它返回一个城市对象[][](多达100个),我运行我的测试。在这个例子中有3个@Test方法。如果我不将测试名称附加到城市名称,我将有一个超文本语言标记报告,它只会一遍又一遍地列出3个测试方法,无法区分它们。 我尝试过这样的例子:这里。 我的测试课做得很好。我遇到的问题是,当

  • 问题内容: 我正在尝试在python3中编写一个简单的递归函数。在学习OO Java时,我还想编写涉及对象的Python代码。这是我的下面的代码。我提示用户输入一个数字,屏幕应该显示每个小到5的整数。 但是,当我在终端上运行它时,它说:“ NameError:未定义名称’recursive’”。错误如下所示: 是什么导致问题出在这里?我知道如何编写递归函数,给它一个参数,然后使其在终端上运行。但是