重新加载页面后,硒将无法在页面上找到元素

时间:2018-08-29 23:48:57

标签: java selenium webdriver

在我重新加载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来尝试找出问题所在,但我不完全建议这样做。我也以一种更实际的方式使用它,但是我还是将这些代码用于测试目的。

这是我的新手,欢迎您的帮助,谢谢。

3 个答案:

答案 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