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

如何在PageFactory中使用FluentWait[副本]

方安怡
2023-03-14
public class LoginPage {

    private WebDriver driver;

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

    @FindBy(xpath = "//div[@class='login']")
    private WebElement loginButton;

    public WebElement getLoginButton() {
        return loginButton;
    }
}


public class TestBase {
public static WebDriver driver = null;

@BeforeTest()
public void initialize() {
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--no-sandbox");
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    }
}


public class LoginTest extends TestBase {

LoginPage loginPage;    

@Test
private void makeLogin() {

loginPage = new LoginPage(driver);

// Does not work with Implicit Wait:
/* 
loginPage.getLoginButton().click;
*/


// Works with Thread.sleep:
/* 
Thread.sleep(4000);
loginPage.getLoginButton().click;
*/

// Does not work with Explicit Wait:
/* 
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(loginPage.getLoginButton()));
loginPage.getLoginButton().click;
*/

// Works with FluentWait:
/*  
new FluentWait<>(driver).withTimeout(Duration.ofSeconds(5)).pollingEvery(Duration.ofMillis(500))
    .ignoring(WebDriverException.class)
    .until(d -> {
                    WebElement el = d.findElement(By.xpath("//div[@class='login']"));
                    el.click();
                    return el;
                });
*/
}

如果使用隐式和显式等待器,将发生以下错误:

org.openqa.selenium.WebDriverException: unknown error: Element <div class="login">...</div> is not clickable at point (225, 334). Other element would receive the click: <div id="cdk-overlay-0" class="cdk-overlay-pane" dir="ltr" style="pointer-events: auto; top: 316px; left: 201.5px;">...</div>
  (Session info: headless chrome=73.0.3683.86)
  (Driver info: chromedriver=2.46.628411 (3324f4c8be9ff2f70a05a30ebc72ffb013e1a71e),platform=Mac OS X 10.14.4 x86_64) (WARNING: The server did not provide any stacktrace information)

共有1个答案

董嘉祯
2023-03-14

第一:我们不应该把隐式和显式的等待混为一谈!这样做会导致不可预测的等待时间。

建议您将PageFactory与AjaxElementLocatorFactory一起使用,它将在访问每个元素时为它们等待指定的秒数,并且忽略CacheLookup标记。

initElements(新的AjaxElementLocatorFactory(驱动程序,15),this);

protected synchronized void waitForElementVisibilityAndClick(WebElement element, int timeOut, String elementName) {
    protected static Wait<WebDriver> wait = null;
    try {
        wait = new FluentWait<WebDriver>((WebDriver) driver).withTimeout(timeOut, TimeUnit.SECONDS).pollingEvery(1,
                TimeUnit.SECONDS);
        wait.until(ExpectedConditions.visibilityOf(element));
        element.click();
    }catch(Exception e) {
    }
}
 类似资料:
  • 我在一个使用Selenium和C#的自动化项目中工作。我使用Page Object模式定义每个页面(带有它们的定位器),然后在一个测试类中分别定义测试。我有一个Page类,它是页面的基类,我在其中调用:PageFactory.initElements(webDriver,this); 并定义所有页面的通用方法。然后每个页面从page继承,并使用@findby注释定义相应的元素: 添加了一个新的登录

  • 问题内容: 在java selenium- webdriver软件包中,有一个类: 每个FluentWait实例都定义了等待条件的最长时间,以及检查条件的频率。此外,用户可以配置等待以在等待时忽略特定类型的异常,例如在页面上搜索元素时的NoSuchElementExceptions。 换句话说,它不仅仅是隐式和显式wait,它还使您可以更好地控制元素的等待。它可能非常方便,并且肯定有用例。 pyt

  • 我想在上面运行代码。但在下面显示消息不起作用。 预测错误(拟合,h=52):未找到对象“拟合” 我的意图是...如果第一个函数有错误(

  • 为了访问一个元素,我使用了以下命令如何通过使用xpath在javascript中使用与在out套件中仅使用xpath相同的功能

  • 问题内容: 我正在使用PageFactory在Selenium WebDriver for C#中构建页面对象模型。 不幸的是,我发现不会初始化(HTML 标签/下拉菜单)。到目前为止,我已经遇到或想出了一些解决方案,但没有一个是理想的: 并且是,因此我不能仅通过继承它们来强制使用。 在每种方法中从实例手动实例化a 都是很麻烦且重复的。除非我每次都添加一个等待,否则它也会忽略明显的内置等待并抛出s

  • 我最近开始使用带有Page对象模式的Selenium2和Page Factory。我使用@FindBy注释声明了WebElements,这些注释在初始化类时由PageFactory初始化。但是,我希望将@findby注释与locators.properties文件一起使用。不幸的是,我似乎无法做到这一点,因为注释被限制为只允许常量表达式。一般来说,这似乎是Java注释的一个限制,但我只是想知道是否