0
我正在Java中編寫Selenium測試來測試簡單的PHP Web應用程序。其中大部分涉及填寫字段。Selenium - 元素不可見錯誤 - 定期發生
如果我嘗試連續兩次(含)以上運行測試,我得到以下錯誤:
org.openqa.selenium.ElementNotVisibleException:
Session ID: ef10680c-429b-4312-9d69-41496e7dce6a
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:127)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:93)
at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:42)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:163)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:601)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:274)
at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)
at com.midamcorp.insurance.TesterNGTest.test(TesterNGTest.java:83)
的說法是正確的元素是不可見的 - 問題是,爲什麼它不可見。在開始時,這個元素被Javascript隱藏。但是,顯示它就像點擊一個鏈接元素一樣簡單。我也在我的測試中執行這個「點擊」。
@BeforeClass
public static void setUpClass() throws Exception {
System.setProperty("webdriver.gecko.driver","C://geckodriver/geckodriver.exe");
driver = new FirefoxDriver();
driver.get(BASE);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}
@Test
public void test() throws Exception {
// login
driver.findElement(By.id("ssn")).clear();
driver.findElement(By.id("ssn")).sendKeys("user");
driver.findElement(By.id("user")).clear();
driver.findElement(By.id("user")).sendKeys("pass");
driver.findElement(By.name("login")).click();
// insurance screen
driver.findElement(By.name("phone")).clear();
driver.findElement(By.id("phone")).sendKeys("phone");
driver.findElement(By.id("email")).clear();
driver.findElement(By.id("email")).sendKeys("email");
driver.findElement(By.id("empSSN")).sendKeys("ssn");
driver.findElement(By.id("address")).clear();
driver.findElement(By.id("address")).sendKeys("address");
driver.findElement(By.id("city")).clear();
driver.findElement(By.id("city")).sendKeys("city");
new Select(driver.findElement(By.id("state"))).selectByVisibleText("Missouri");
driver.findElement(By.id("zip")).sendKeys("63780");
driver.findElement(By.id("genderFemale")).click();
if(!(driver.findElement(By.cssSelector("input[type='checkbox")).isSelected())) { driver.findElement(By.cssSelector("input[type='checkbox")).click(); }
driver.findElement(By.cssSelector("input[value='1']")).click();
new Select(driver.findElement(By.name("employmentLocation"))).selectByVisibleText("Central Office");
driver.findElement(By.cssSelector("input.btn.btn-primary")).click();
// enrollment
// the code below is supposed to see if the container for the radio buttons is hidden, if so, click the link to display them
if(!(driver.findElement(By.id("healthOnly")).isDisplayed())) {
driver.findElement(By.cssSelector("a[href='#healthOnly']")).click();
}
// the line below is the one that throws the error; the link noted above is not being clicked and thus the container with the radio buttons remains hidden
List<WebElement> insuranceOptions = driver.findElements(By.cssSelector("#healthOnly input[type='radio']"));
insuranceOptions.get(rand.nextInt(insuranceOptions.size() - 1)).click();
insuranceOptions = driver.findElements(By.cssSelector("input[name='visionID']"));
insuranceOptions.get(rand.nextInt(insuranceOptions.size() - 1)).click();
我簡單的Javascript/jQuery函數來顯示和隱藏元素。當我手動點擊它時,它按預期工作。
$(".insuranceOptionsToggle").click(function(e){
e.preventDefault();
$($(this).attr("href")).toggle();
$(this).toggleClass("active");
});
感謝您的回覆。我是Selenium的新手,但我認爲隱含的等待電話會阻止這種情況發生?另外,從我的帖子可能不清楚,但單擊(鏈接)的.insuranceOptionsToggle元素始終可見(所以它實際上是在正常用戶交互過程中調用的函數)。點擊該鏈接可取消隱藏單選按鈕的div元素。它是不總是顯示的div。再次感謝。 – KellyMarchewa
我找不到信息來證明這一點,但我認爲隱含的等待可能只是等待元素的存在而不是可見性。我認爲你得到'ElementNotVisibleException'而不是'NoSuchElementException'的事實表明了這一點。你可以使用'WebDriverWait'並等待這裏的可見性,看看是否解決了這個問題。注:不要一起使用隱式和顯式等待,它會給你每個文檔不可靠的結果。 http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp – JeffC