我正在嘗試測驗 GeeksForGeeks UI。當我單擊教程下拉選單,然后選擇語言并選擇 Java 時,它會鏈接到一個新頁面,并出現以下錯誤 org.openqa.selenium.StaleElementReferenceException。我該如何解決這個問題?我已經嘗試了 stackoverflow 中所有可能的解決方案。
public class SeleniumTest {
public static WebDriver driver;
@BeforeClass
public static void setupClass() {
System.setProperty("webdriver.chrome.driver", "driver/chromedriver.exe");
}
@Before
public void setup() {
driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
}
@After
public void after() {
driver.close();
}
@Test
public void testGeeksForGeeksR() throws InterruptedException {
driver.get("https://www.geeksforgeeks.org/");
WebElement tutorialsMenu = driver.findElement(By.className("header-main__list-item"));
tutorialsMenu.click();
List<WebElement> tutorialsList = tutorialsMenu.findElements(By.tagName("li"));
for (WebElement li : tutorialsList) {
if (li.getText().equals("Languages")) {
li.click();
List<WebElement> languages = driver.findElements(By.tagName("a"));
for (WebElement a : languages) {
if (a.getText().equals("Java")) {
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(a));
a.click();
WebElement title = driver.findElement(By.className("entry-title"));
assertEquals("Java Programming Language", title.getText());
}
}
}
}
Thread.sleep(6000);
}
}
解決方案:
@Test
public void testGeeksForGeeksR() throws InterruptedException {
driver.get("https://www.geeksforgeeks.org/");
WebElement tutorialsMenu = driver.findElement(By.className("header-main__list-item"));
tutorialsMenu.click();
List<WebElement> tutorialsList = tutorialsMenu.findElements(By.tagName("li"));
WebElement javaLanguage = null;
for (WebElement li : tutorialsList) {
if (li.getText().equals("Languages")) {
li.click();
List<WebElement> languages = driver.findElements(By.tagName("a"));
for (WebElement a : languages) {
if (a.getText().equals("Java")) {
javaLanguage = a;
break;
}
}
}
}
javaLanguage.click();
driver.switchTo().activeElement();
WebElement title = driver.findElement(By.className("entry-title"));
assertEquals("Java Programming Language", title.getText());
Thread.sleep(3000);
}
uj5u.com熱心網友回復:
單擊帶有文本的a元素后,將打開頁面。
此時上一頁收集的所有元素參考都變成了.
通常,每個 Selenium物件實際上都是物理 Web 元素物件的參考(指標)。
因此,當您打開另一個網頁或重繪 現有頁面(在那里重新加載 Web 元素)時,對前一個網頁上的 Web 元素的所有參考都不再有效。
在 Selenium 術語中,這種情況稱為Stale Element。
回到您的特定代碼流。
看起來你的目標是打開JavaJava Programming LanguageStaleWebElementJava Programming Language頁。如果是這樣,那么您在這里缺少的只是在打開該頁面并完成測驗后退出回圈。
如果您希望繼續從主頁上的選單打開另一個教程,您將不得不從您打開的內部頁面回傳,然后再次獲取您希望使用的所有元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/436840.html
