在我重新加载Java的Selenium Web驱动程序中的页面后,一直遇到这个问题,我事先声明的元素将不会再次被选择来发送密钥。例如,我写这篇文章是为了找出问题所在。
package test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class googleTest {
public static void main(String[] args)throws InterruptedException {
WebDriver driver = new FirefoxDriver();
driver.get("https://www.google.com");
Thread.sleep(1000);
WebElement search = driver.findElement(By.name("q"));
search.sendKeys("test");
Thread.sleep(1000);
driver.navigate().refresh();
Thread.sleep(1000);
search.sendKeys("test");
}
}
它将第一次选择搜索栏,然后键入test。之后,在重新加载后,它不会将测试发送到搜索栏。我尝试将其重新查找为其他WebElement,但这也不起作用。我还使用thread.sleep
来尝试找出问题所在,但我不完全建议这样做。我也以一种更实际的方式使用它,但是我还是将这些代码用于测试目的。
这是我的新手,欢迎您的帮助,谢谢。
答案 0 :(得分:1)
是的,这是正常的硒行为!
重新加载页面时,无论是强制页面还是刷新浏览器,该页面上找到的所有WebElements
都将抛出StaleElementException
。
重新加载页面时,您需要刷新所有元素,然后再次有效地定位它们。因此,大多数人会尽快改用PageObject模型(也值得关注PageFactory),因为这简化了刷新所有元素的过程。
答案 1 :(得分:0)
一种处理它的方法是在使用之前再次标识该元素,如下所示:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/demo_shape"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingBottom="5dp"
android:paddingLeft="18dp"
android:paddingTop="5dp"
android:text="Hey"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/demo_shape"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingBottom="5dp"
android:paddingLeft="18dp"
android:paddingTop="5dp"
android:text="Hey"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/demo_shape"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingBottom="5dp"
android:paddingLeft="18dp"
android:paddingTop="5dp"
android:text="Hey"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/demo_shape"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_weight="1"
android:paddingBottom="5dp"
android:paddingLeft="18dp"
android:paddingTop="5dp"
android:text="Hey"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
说明:
刷新页面后,网页的DOM会更改,因此已标识并存储为webelement的元素将不可用,因此刷新后必须在DOM上再次搜索。
答案 2 :(得分:0)
实际上,刷新页面后,先前指向的webElement将被清除并获取StaleElementException。
如果不想使用PageFactory,那么最好使用隐式或显式等待(检查元素的可见性)而不是thread.sleep