我的程序中有一个if语句可以处理我的反应,如果我被引导到一个页面,要求我在登录过程中输入一个秘密问题的答案。如果我被引导到这个页面,它应该填写答案,如果我被引导到密码页面,我的程序应该继续正常运行。为了处理我是否被定向到秘密问题页面,我使用if语句来检查该页面上的元素是否存在。目前,我使用以下内容:
if(driver.findElements(By.className("answer")).size() == 0){
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);//wait for 10 sec.
WebElement element1 = pageLoadWait1.until(ExpectedConditions.elementToBeClickable(By.name("answer")));
WebElement answer = driver.findElement(By.name("answer"));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
}
我遇到的问题是,当我没有被重定向到秘密页面,而只是重定向到密码页面时,它仍然在寻找answer
类名称,不存在。
我还使用了.isDisplayed()
,并收到了类似的结果,这让我觉得它与if语句背后的逻辑有关,但事实上该程序仍然在寻找{{ 1}}即使它不存在也让我认为它与我检查元素存在的方式有关。
答案 0 :(得分:1)
您发布的代码段中的第一个if
语句将检查具有类answer
的元素,如果不存在,则会检查名为answer
的元素。我认为这应该是相反的。我已经修改了代码并进行了一些改进。
Selenium将检查你是否设置了任何隐式等待。如果你设置了一个隐式等待(比方说10秒),driver.findElements
将每隔500毫秒寻找一个元素直到10秒。如果在10秒后元素未找到0返回。
在下面的代码中,我假设您没有设置任何隐式等待。
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
// wait for 10 seconds to see if the secret page has loaded.
int retryCount = 0;
boolean secretPageLoaded = false;
while (retryCount++ < 10) {
if (driver.findElements(By.className("answer")).size()!=0) {
secretPageLoaded = true;
break;
}
Thread.sleep(1000);
}
if(secretPageLoaded){
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);//wait for 10 sec.
WebElement answer = pageLoadWait1.until(ExpectedConditions.elementToBeClickable(By.name("answer")));
// You can remove the below line as the element will be returned in the above statement
//WebElement answer = driver.findElement(By.name("answer"));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
}
答案 1 :(得分:1)
当您使用fork
时,您告诉司机要查找带有班级名称的元素&#34;回答&#34;,司机无法知道&#39;没有这样的元素。您可以尝试使用findElements(By.className("answer")).size()
阻止
try catch
如果try {
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);
WebElement answer = pageLoadWait1.until(ExpectedConditions.visibilityOfElementLocated(By.name("answer")));
answer.sendKeys(security);
answer.sendKeys(Keys.ENTER);
}
catch (TimeoutException) {
// do something if you like
}
// continue...
找到该元素,他将继续pageLoadWait1.until
。如果它没有,代码将直接进入捕获(sendKeys
种类。)
两个笔记
if else
表示
司机正在等待向上到10秒钟
WebDriverWait pageLoadWait1 = new WebDriverWait(driver, 10);
如果是真的,它可能根本不会等待
条件为真(您的评论是错字?)。ExpectedConditions
返回您正在等待的元素,无需再次查找。