【发布时间】:2020-07-13 17:36:31
【问题描述】:
查看 selenium 文档后,我想知道我是否尝试错误地实现显式等待。
在文档中,它总是显示识别一个新元素,然后将定义的等待分配给所述元素
WebDriver driver = new ChromeDriver();
driver.get("https://google.com/ncr");
driver.findElement(By.name("q")).sendKeys("cheese" + Keys.ENTER);
// Initialize and wait till element(link) became clickable - timeout in 10 seconds
WebElement firstResult = new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.elementToBeClickable(By.xpath("//a/h3")));
// Print the first result
System.out.println(firstResult.getText());
在本例中,创建了一个新元素 firstResult,然后将定义的等待分配给它。
这是必需的吗?应该总是这样吗?
这就是我问的原因。
我正在使用 PageFactory 模型并通过 FindBy 注释定义我的元素,如下所示。
// Input field for slice ID
@FindBy(how = How.XPATH, using = "//input[@name='id']")
private WebElement inputSliceId;
然后,在同一个类中,我定义了一些方便的方法来使用它们。
那么现在,在我方便的方法中,我应该这样做吗?
inputSliceId = new WebDriverWait(driver, Duration.ofSeconds(10))...
inputSliceId.sendKeys(...
我一直在做的,也就是我现在要质疑的,是放置未直接分配给相关元素的等待语句。
例如,我一直在做这样的事情。
buttonSubmit.click();
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@role='alertdialog']")));
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@role='alertdialog']")));
为什么? (这里可能完全错了)
点击按钮后,我需要等待弹出窗口显示 一旦它发生了,我就在等待它消失,然后再继续
这是主要问题 这两条等待线是否真的没有做任何事情,因为我没有将它们分配给一个元素?还是它们仍然导致 Web 驱动程序保持到等待指定的条件发生?
【问题讨论】:
-
这并不是你“将它们分配给一个元素”......而是 webdriverwait 将返回一些东西或抛出。如果你不需要它,你不需要存储它。无论哪种方式,它都会等到满足预期条件。不同的预期条件有不同的类型,这就是返回的内容。 (最常见的是bool或webelement):selenium.dev/selenium/docs/api/java/org/openqa/selenium/support/…
标签: selenium selenium-webdriver webdriver webdriverwait expected-condition