如何在selenium testng中放置等待命令

how to put wait command in selenium testng

当 运行 TestNG 和 WebDriver 中的以下代码时,测试用例失败。让我知道隐式和显式等待是否正确实现。

public class QCEntry
{
    private WebDriver browser;
    private String baseUrl;

    @BeforeClass
    public void setUp() throws Exception
    {
        browser = new FirefoxDriver();
        baseUrl = "http://www.example.org/";
        browser.get(baseUrl);
        browser.manage().window().maximize();
        browser.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        browser.findElement(By.id("ctl00_cphMain_txtUsername")).clear();
    }

    @Test
    public void testImportexport1() throws Exception
    {
        for (int row = 1; row < s.getRows(); row++)
        {
            WebDriverWait wait5 = new WebDriverWait(browser, 100);
            browser.findElement(By.id("ctl00_ctl00_cphMain_cphTest_LocationPanel_ddlSiteLevel3")).click();
            wait5.until(ExpectedConditions.visibilityOfElementLocated(By.id("ctl00_ctl00_cphMain_cphTest_LocationPanel_ddlSiteLevel3")));
            browser.findElement(By.id("ctl00_ctl00_cphMain_cphTest_LocationPanel_ddlSiteLevel3")).sendKeys("Ames");
        }
    }
}

请参阅我上面的评论以获取更多信息。我将再次编辑此答案,但我确实对您的元素交互进行了观察。

您似乎正在单击一个元素,等待它可见,然后向其发送击键。我建议使用等待作为元素的初始值设定项,从而在点击和发送键之前等待。同样,虽然您的代码在调用操作的方式上在技术上是正确的,但有一种更有效的方法可以做到这一点。 ExpectedConditions 方法(至少其中大部分)return WebElement,允许您在一个语句中执行等待和初始化元素。

试试这个:

WebElement element = wait5.until(ExpectedConditions.visibilityOfElementLocated(By.id("ctl00_ctl00_cphMain_cphTest_LocationPanel_ddlSiteLevel3")));
element.click();
element.sendKeys("Ames");

这使您只需定义一次元素 ID(增强可维护性),而且还将等待合并到元素初始化中。那么,就如同使用元素调用命令一样简单。

我想看看您遇到的错误,但是您在点击 之后调用等待似乎没有多大意义。一旦您向您的问题添加了一些新的细节,我将对此进行编辑。

您需要添加一些错误信息...您遇到了什么错误以及在哪里?

除此之外,我会先进行一些基本清理,这可能有助于解决您的错误。

  1. Don't mix implicit and explicit waits.
  2. 声明定位器并重用它们。
  3. wait.until returns 一个元素。直接存储或使用它而不是再次抓取页面。
  4. 您是否意识到您正在单击一个元素,然后等待该元素可见,然后在同一元素中输入文本?看起来很奇怪,也许你应该至少与几个不同的元素交互,而不是一个。

    public class QCEntry
    {
        private WebDriver browser;
        private String baseUrl;
    
        @BeforeClass
        public void setUp() throws Exception
        {
            browser = new FirefoxDriver();
            baseUrl = "http://www.example.org/";
            browser.get(baseUrl);
            browser.manage().window().maximize();
            browser.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
            browser.findElement(By.id("ctl00_cphMain_txtUsername")).clear();
        }
    
        @Test
        public void testImportexport1() throws Exception
        {
            By somethingLocator = By.id("ctl00_ctl00_cphMain_cphTest_LocationPanel_ddlSiteLevel3");
            for (int row = 1; row < s.getRows(); row++)
            {
                WebDriverWait wait5 = new WebDriverWait(browser, 100);
                browser.findElement(somethingLocator).click();
                wait5.until(ExpectedConditions.visibilityOfElementLocated(somethingLocator)).sendKeys("Ames");
            }
        }
    }