【发布时间】:2019-09-20 02:52:12
【问题描述】:
隐式和显式等待不起作用。
如何解决?
如何在PageFactory中使用FluentWait,这样在测试中就不需要使用定位器了。
尽量不要使用 Thread.sleep。
使用的工具:Selenium、TestNG、WebDriverManager
网站是在 AngularJS 上制作的。
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)
【问题讨论】:
-
如果您阅读了错误消息,它会准确地告诉您发生了什么。您试图点击
<div class="login">,但<div id="cdk-overlay-0" ...>挡住了路。您需要先处理覆盖。如果没有 URL 或更多描述,我们无法告诉您如何针对您的特定情况执行此操作……可能是等待覆盖层可见、不可见,然后单击您的元素,或者它可能会处理一个弹出窗口已经出现(关闭它等)。您需要进行更多研究,然后返回并使用其他详细信息编辑您的问题。 -
哦...声称
Implicit and Explicit wait don't work有点傻。其他人都可以很好地使用它们,因此它们可以正常工作,而您只是在错误地使用它们。
标签: selenium selenium-webdriver