【问题标题】:Selenium wait until email is sentSelenium 等到发送电子邮件
【发布时间】:2015-06-12 17:40:51
【问题描述】:

我正在编写一个简单的程序来测试 gmail 的功能,其中包括发送电子邮件。

我让程序发送一封电子邮件,一旦确认已发送,它就会注销。

我不想在消息发送时退出,只有在消息发送完成时才退出。

因此,如果您有 gmail,并且当您发送消息时,您会在收件箱上方看到一条小通知,上面写着“您的消息已发送。查看消息。”

为此的 cssSelector 是 div.vh。

所以我希望我的程序等到弹出该窗口后再注销。

但有时由于互联网速度,它会在消息出现之前注销。

这是我的代码:

WebElement element = (new WebDriverWait(driver,10)).until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.vh")));

【问题讨论】:

  • 为什么不等待超过 10 秒?
  • 像使用 Thread.sleep(10000); 那样强制等待确实不是最佳选择;我应该只等待需要的时间。
  • 我认为@satnam 的意思是您在WebDriverWait 中使用了10 秒的默认超时,如果发送消息需要更多时间,那么它将在10 秒后停止等待。那么为什么不使用更长的默认超时时间呢?
  • 发送该消息的时间确实不会超过 10 秒,但我会尝试您的建议并执行 100 秒之类的操作,

标签: java selenium selenium-webdriver automation webdriver


【解决方案1】:

相反,您可以尝试以下方法:

WebElement element = null;
WebDriverWait wait = new WebDriverWait(driver,10);
int counter = 0; //optional, just to cut off infinite waiting 
while( element == null && counter != 10 ){
    try{
        element = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.vh")));
    } catch(TimeoutException te) {
        log.info("Not loaded yet, continuing");
        counter++;
    }
}
// logout now.

【讨论】:

    【解决方案2】:

    点击发送按钮后,尝试等待加载文本消失。

    //Click send
    driver.findElement(By.xpath("//div[text()='Send']")).click();
    
    //wait for element to disappear
    
    waitForElementToDisappear(By.xpath("//div[contains(text(),'Loading')]"));
    
    or
    
     //wait for element to appear
    waitForElementToAppear(By.id("link_undo"));
    
    
        void waitForElementToDisappear(By locator)
        {
                    int i=0;
                    while(isElementPresent(locator))
                    {
                        Thread.sleep(100);
                        i++;
                        if(i>50)
                        {
                            break;
                        }
                    }
        }
    
       void waitForElementToAppear(By locator)
        {
                    int i=0;
                    while(!isElementPresent(locator))
                    {
                        Thread.sleep(100);
                        i++;
                        if(i>50)
                        {
                            break;
                        }
                    }
        }
    

    您可以在下面的链接中找到 isElementPresent 方法的实现。

    isElementPresent is very slow in case if element does not exist.

    【讨论】:

    • waitForElementToAppear 和 Disappear 的实现是相同的。如果元素出现,它必须等待 5 秒然后中断。出现方法中的while循环应该伴随着! .并且不鼓励使用 Thread.sleep。
    • 谢谢维韦克。是的我同意。更新了我的答案。如果您执行任何等待方法,它将包含 Thread.sleep。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2013-07-18
    • 2012-09-18
    • 2011-09-16
    • 2012-04-09
    相关资源
    最近更新 更多