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

如何在Selenium中处理页面对象模型中的动态元素?

傅泉
2023-03-14

可以在页面对象模型中处理动态元素吗?

例子:

package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

public class Home_Page {
    WebDriver driver;

    public Home_Page(WebDriver driver) {
        this.driver = driver;
    }

    @FindBy(how=How.XPATH, using = "//input[@name = '%s']")
    public WebElement inputField;
}

我想从测试方法中传递输入的name属性值。

package scripts;

@Test
public void test(){
        driver.get("url");
        Home_Page homepage = PageFactory.initElements(driver, Home_Page.class);
        homepage.inputField.sendKeys("xpathParameter", "sendKeysVal"); 
}

共有2个答案

满昊然
2023-03-14

如果您想使用findBy查找元素并动态提供page ename,这种类型的东西应该很有用。

import org.openqa.selenium.By;
public class CreateLocators {
    public static By buildByObject(String pageName, String fieldName) {
        try {
            Class<?> clas = Class.forName("pageobjects." + pageName);
            Object obj = clas.newInstance();
            return new Annotations(obj.getClass().getDeclaredField(fieldName)).buildBy();
        } catch (NoSuchFieldException e) {
            return null;
        }
    }
}

StepDef中,您应该执行以下操作:

byElem = CreateLocators.buildByObject(pageName, desiredElementNameInPO);
        elem = driver.findElement(byElem);
        elem.click();
池庆
2023-03-14

不可能以您想要的方式实现,因为在Java-Java注释中,无法动态地将值传递给注释。Java注释以动态方式提供值。

但是,您可以用|方法|替换您的|类字段注释|来实现相同的目的:

package pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.How;

public class Home_Page {
    WebDriver driver;

    public Home_Page(WebDriver driver) {
        this.driver = driver;
    }

    public WebElement inputField(String name) {
       return this.driver.findElement(String.format(By.xpath("//input[@name = '" + name + "']");
    }
}


package scripts;

    @Test
    public void test(){
        driver.get("http://play.krypton.infor.com");
        Home_Page homepage = PageFactory.initElements(driver, Home_Page.class);
        homepage.inputField("xpathParameter").sendKeys("sendKeysVal"); 
    }
 类似资料:
  • 我已经看过很多带有页面对象模型的示例Selenium框架,它们通常显示: 如果内容(方法,web元素)在页面对象类中是静态的,并且它们被暴露在驱动程序类的实例中,那么它看起来像: 我看不到通过创建页面对象类的实例得到了什么。后一种方法看起来更干净,它消除了测试中的大量噪音,并且更容易培训缺乏编程技能的无经验自动化测试人员。 在使用后一种方法时是否有任何固有的缺点?我想不出有什么办法,但似乎没有任何

  • 希望我不是第一个遇到这个问题的人。 问题是我还需要检查该元素在页面上是否可见,并且在执行checked之前它会出错(例如,使用WebDriverWait,将ExpectedConditions.ElementisVisible(by)传递给.Until方法)。 我如何将IWebElement和By locator清晰地分开,并允许在需要的地方进行这种明确的等待/检查? TLDR-如何维护页面对象模

  • 我们如何等待IWebElement(重新)连接到DOM?我的场景是这样的,我从dropdown1中选择一个值,然后单击dropdown2上的数据绑定。所以当我的测试像从Dd1中选择“foo”,然后从Dd2中选择“bar”- 但是我真的不想把定位器字符串(“foo”)带到我的测试逻辑中,因为它似乎破坏了使用页面对象模型的意义。使用页面对象模型时,我已经有了IWebElement实例 那么,您知道隐式

  • POJO: 在上面的代码POJO TrackerRefResponse.java前缀responseMessage被设置为responseMessage类型的string或object,所以我们可以用同名的ref变量(java basics:)创建POJO,所以我正在为Referfit中的dynamic寻找相同的解决方案。我知道这在带有异步任务的普通http客户端中非常容易,但这不是REST-AP

  • 我有一个关于selenium WebDriver中页面对象的问题。我们的站点非常动态,有很多ajax和各种身份验证状态。如何定义每个页面对象,但让我们假设我已经弄清楚了,并定义了代表我们站点的几个页面对象。 你如何处理从一页到另一页的交叉?因此,我得到一个页面对象用于我的主页,一个用于我的帐户页面,一个用于我的结果页面。然后我需要编写一个遍历我所有页面的测试来模拟一个用户执行多个动作。

  • 我正在寻找解决方案,如何在selenium webdriver的页面对象模型中获取相对于另一个对象的页面对象 我的测试代码: 下一页 配置类 我的测试课 在FirstPage和NextPage这两个类中,我都通过xpath找到元素,xpath具有相同的第一部分//div[@class='widget'],这意味着所有元素(如按钮和链接)都在这个小部件下,我在我的所有页面中都有相同的小部件xpath