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)
第一:我们不应该把隐式和显式的等待混为一谈!这样做会导致不可预测的等待时间。
建议您将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注释的一个限制,但我只是想知道是否