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

如何通过页面对象模型使用WebElements和Actions?

郑星辰
2023-03-14

我的网页上有一个按钮,一旦输入所需的信息,我想点击它。我目前正在使用By来建立页面的所有元素,但想使用WebElements作为这个按钮,然后使用Actions稍后单击它。我应该如何在我的页面对象类中做到这一点。

我尝试了以下方法:

WebElement addressinput = driver.findElement(By.xpath("//input[@id='pac-input']"));
By addressinput = By.xpath("//input[@id='pac-input']");//this works fine

但在以TestNG的形式运行测试类时,它在WebElement行上显示空指针异常。也尝试使用By执行此操作,但按钮无法收到单击。它与WebElements配合得非常好,我以前在不使用POM的情况下尝试过的动作如下所示:

WebElement button = driver.findElement(By.xpath("//button[@id='btn_gtservice']"));  
Actions action = new Actions(driver);
action.moveToElement((WebElement) CheckAvailability).click().perform();
driver.switchTo().defaultContent();

共有2个答案

史逸春
2023-03-14

在PageObjectModel中使用PageFactory时,如果您希望在输入某些信息后通过某些JavaScript加载元素,并且该元素可能不会立即出现在页面上,则可以在通过WebDriverWait支持和普通定位器工厂返回元素后使用操作,如下所示:

>

package com.pol.zoho.PageObjects;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.interactions.Actions;

public class ZohoLoginPage {

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

    @FindBy(xpath="//button[@id='btn_gtservice']")
    public WebElement myButton;

    public void doLogin(String username,String userpassword)
    {
        WebElement button = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(ZohoLoginPage.getWebElement()));
        new Actions(driver).moveToElement(button).click().perform();
    }

    public WebElement getWebElement()
    {
        return myButton;
    }

}

您可以找到关于如何对PageFactory字段和PageObject模式使用显式等待的详细讨论

罗法
2023-03-14

你有

action.moveToElement((WebElement)检查可用性)

那应该是

动作。moveToElement((按钮)检查可用性)

事实上,您将得到一个空指针,因为您没有定义名为WebElement的变量

 类似资料:
  • 我正在评估作为网络回归工具的Telerik测试工作室(http://www.telerik.com/automated-testing-tools),并寻找如何设置和使用页面对象模型环境,就像在Selenium中一样。 http://code.google.com/p/selenium/wiki/PageObjects 他们的文档侧重于录制/回放,这非常脆弱,我的谷歌搜索也没有找到相关链接。

  • 我想在我的页面对象中使用剧作家的定位器。我找到了一个Javascript示例(为了简洁起见,将其剥离): 试图在我的Java代码中做同样的事情: 引发空指针异常,因为初始化登录按钮时,尚未启动。 我可以 但是对于大型页面对象类来说,这将变得有点冗长/混乱。 有没有关于如何在Java中实现这一点的想法? 谢谢

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

  • 我有一个包含50多个WebElements的页面,我希望这些Web元素具有正确的文本。我使用的是页面对象,因此测试与对象是分开的,测试是断言必须存在的地方。 我不希望每个元素有50个单独的@Test,所以我需要某种集合、列表或数组来保存文本值,然后针对每个值进行断言。但是,如果一个文本值错误,我不希望测试失败(很可能是一个页面经常更新并且包含50个值的情况)。这意味着为每个断言分别设置@Test?

  • 我正在使用Selenium为我的网站构建一个测试框架,我实际上希望您在使用页面对象模型时对良好实践的想法:让我们说,我有一个欢迎页面,其中包含一个注销按钮存在的标题,这个标题可以在大多数页面中看到在我的页面中,我认为最好为标题写一个单独的类,比如: 公共类欢迎页 我的问题是,你认为在欢迎页面中包含标题作为属性更好还是应该将它们分开? 让我们以注销测试方法的代码为例: 案例一: 案例2: 第二个问题

  • 是否有任何Gem(比如siteprism:用于Web自动化测试)可以在我的移动自动化测试项目中使用,以使用页面对象模型模式定义屏幕。 提前谢谢