如何在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(增强可维护性),而且还将等待合并到元素初始化中。那么,就如同使用元素调用命令一样简单。
我想看看您遇到的错误,但是您在点击 之后调用等待似乎没有多大意义。一旦您向您的问题添加了一些新的细节,我将对此进行编辑。
您需要添加一些错误信息...您遇到了什么错误以及在哪里?
除此之外,我会先进行一些基本清理,这可能有助于解决您的错误。
- Don't mix implicit and explicit waits.
- 声明定位器并重用它们。
wait.until
returns 一个元素。直接存储或使用它而不是再次抓取页面。
您是否意识到您正在单击一个元素,然后等待该元素可见,然后在同一元素中输入文本?看起来很奇怪,也许你应该至少与几个不同的元素交互,而不是一个。
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");
}
}
}
当 运行 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(增强可维护性),而且还将等待合并到元素初始化中。那么,就如同使用元素调用命令一样简单。
我想看看您遇到的错误,但是您在点击 之后调用等待似乎没有多大意义。一旦您向您的问题添加了一些新的细节,我将对此进行编辑。
您需要添加一些错误信息...您遇到了什么错误以及在哪里?
除此之外,我会先进行一些基本清理,这可能有助于解决您的错误。
- Don't mix implicit and explicit waits.
- 声明定位器并重用它们。
wait.until
returns 一个元素。直接存储或使用它而不是再次抓取页面。您是否意识到您正在单击一个元素,然后等待该元素可见,然后在同一元素中输入文本?看起来很奇怪,也许你应该至少与几个不同的元素交互,而不是一个。
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"); } } }