Ссылка на устаревший элемент: элемент не прикреплен к документу страницы для Java-Selenium - PullRequest
0 голосов
/ 20 ноября 2018

Что я пытаюсь сделать, это после входа в систему, драйвер нажимает на раскрывающееся меню «Свойства», выбирает параметр, нажимает на «Отправить» и повторяет процесс, пока цикл не будет завершен.

Ниже приведен мой код:

package com.genericlibrary;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

import com.util.Highlighter;

public class MobopsSearchJobsFromDropDown {

    WebDriver driver;
    Highlighter color;

    public void getSetup() {
        String path = System.getProperty("user.dir");
        String driverPath = path + "\\Driver\\chromedriver.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        driver = new ChromeDriver();
        driver.navigate().to("http://mobops-test.jcdecauxna.com/");
        driver.manage().window().maximize();
    }

    public void logIntoMobops() {
        WebElement userName = driver.findElement(By.xpath("//*[contains(@id,'username')]"));
        WebElement passWord = driver.findElement(By.xpath("//*[contains(@id,'password')]"));
        WebElement loginButton = driver.findElement(By.xpath("//*[contains(text(),'Login')]"));

        userName.sendKeys("test2");
        passWord.sendKeys("1234");
        loginButton.click();

    }

    public void selectEachPropertyAndSeachJob() {
        WebElement dateRange = driver.findElement(By.xpath("//*[contains(@name,'date_range')]"));
        WebElement last7days = driver.findElement(By.xpath("(//*[contains(text(),'Last 7 Days')])[2]"));
        WebElement searchJobs = driver.findElement(By.xpath("//*[contains(@name,'layout')]"));
        WebElement propertyDropdown = driver.findElement(By.xpath("//*[contains(@id,'property_id')]"));

        Select dropdown = new Select(propertyDropdown);

        List<WebElement> optionsInPropertyDropdown = dropdown.getOptions();
        for (int i = 0; i < optionsInPropertyDropdown.size(); i++) {
            if (propertyDropdown.isDisplayed() && propertyDropdown.isEnabled()) {
                try {
                    propertyDropdown.click();
                    dropdown.selectByVisibleText(optionsInPropertyDropdown.get(i).getText());
                    dateRange.click();
                    last7days.click();
                    searchJobs.click();
                    System.out.println("Option Search is " + optionsInPropertyDropdown.get(i).getText());

                } catch (org.openqa.selenium.StaleElementReferenceException ex) {
                    WebDriverWait wait = new WebDriverWait(driver, 30);
                    wait.until(ExpectedConditions.visibilityOf(propertyDropdown));
                }
            }

        }

    }

    public static void main(String[] args) {

        MobopsSearchJobsFromDropDown obj = new MobopsSearchJobsFromDropDown();
        obj.getSetup();
        obj.logIntoMobops();
        obj.selectEachPropertyAndSeachJob();

    }
}

В данный момент драйвер просто выбирает первый вариант и нажимает кнопку "Отправить".Сразу после загрузки страницы после завершения поиска я получаю следующую ошибку:

Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

Я пытался реализовать следующий код в своем коде, но, поскольку я новичок, я понятия не имею, как реализоватьЧтобы устранить эту проблему, выполните следующие действия:

new WebDriverWait(driver, timeout)
        .ignoring(StaleElementReferenceException.class)
        .until((WebDriver d) -> {
            d.findElement(By.xpath("//*[contains(@id,'property_id')]")).click();
            return true;
        });

Любая помощь по преодолению этой проблемы очень ценится.Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

после выполнения searchJobs.click ();Ваша страница перезагрузится, поэтому все ссылки на ранее найденные элементы будут потеряны.Вам нужно получить все ваши WebElements, выпадающий список Select и список параметров снова после searchJobs.click ();прежде чем использовать их во второй раз.Так что не экономьте webelements.

Примерно так должно работать:

public void selectEachPropertyAndSeachJob() {
    Select dropdown = new Select(driver.findElement(By.xpath("//*[contains(@id,'property_id')]")));
    List<WebElement> optionsInPropertyDropdown = dropdown.getOptions();
    for (int i = 0; i < optionsInPropertyDropdown.size(); i++) {
        if (driver.findElement(By.xpath("//*[contains(@id,'property_id')]")).isDisplayed()) {

            //propertyDropdown.click(); no need to click
            dropdown.selectByVisibleText(optionsInPropertyDropdown.get(i).getText());
            driver.findElement(By.xpath("//*[contains(@name,'date_range')]")).click();
            driver.findElement(By.xpath("(//*[contains(text(),'Last 7 Days')])[2]")).click();
            driver.findElement(By.xpath("//*[contains(@name,'layout')]")).click();

            // Need to find it again
            dropdown = new Select(driver.findElement(By.xpath("//*[contains(@id,'property_id')]")));
            optionsInPropertyDropdown = dropdown.getOptions();

            System.out.println("Option Search is " + optionsInPropertyDropdown.get(i).getText());
        }
    }

}

Вместо того, чтобы каждый раз использовать driver.findElement, вы можете сохранять свои локаторы как элементы By и создавать собственный метод поиска.

0 голосов
/ 21 ноября 2018

Кто-то помог мне с проблемой.Ниже приведено решение:

public class MobopsSearchJobsFromDropDown {
    WebDriver driver;
    HighLighter color;

    public void getSetup() throws Throwable {
        String path = System.getProperty("user.dir");
        String driverPath = path + "\\driver\\chromedriver.exe";
        System.setProperty("webdriver.chrome.driver", driverPath);
        driver = new ChromeDriver();
        driver.navigate().to("http://mobops-test.jcdecauxna.com/");
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }

    public void logIntoMobops() throws Throwable  {
        WebElement userName = driver.findElement(By.xpath("//*[contains(@id,'username')]"));
        WebElement passWord = driver.findElement(By.xpath("//*[contains(@id,'password')]"));
        WebElement loginButton = driver.findElement(By.xpath("//*[contains(text(),'Login')]"));

        userName.sendKeys("test2");
        passWord.sendKeys("1234");
        loginButton.click();

    }

    public void selectEachPropertyAndSeachJob() throws Throwable  {
        WebDriverWait wait = new WebDriverWait(driver, 30);
        List<WebElement> dropdownoptions = driver.findElements(By.xpath("//select[@id = 'property_id']//option"));
        for(int i =0; i<dropdownoptions.size(); i++) {
            String propertyDropdown = "//*[contains(@id,'property_id')]";
            String dateRange = "//*[contains(@name,'date_range')]";
            String last7days = "(//*[contains(text(),'Last 7 Days')])[2]";
            String searchJobs = "//*[contains(@name,'layout')]";
            Select dropdown = new Select(waitMethod(propertyDropdown));
            WebElement option = dropdown.getOptions().get(i);
            wait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(option)));
            dropdown.selectByVisibleText(option.getText());
            System.out.println(option.getText());
            waitMethod(dateRange).click();
            waitMethod(last7days).click();
            waitMethod(searchJobs).click();
            driver.navigate().refresh();    
        }
    }
    public WebElement waitMethod(String waiting) {
        WebDriverWait wait = new WebDriverWait(driver, 30);
        WebElement waitForRefresh =wait.until(ExpectedConditions.refreshed(ExpectedConditions.presenceOfElementLocated(By.xpath(waiting))));
        return waitForRefresh;
    }

    public static void main(String[] args) throws Throwable {
        MobopsSearchJobsFromDropDown obj = new MobopsSearchJobsFromDropDown();
        obj.getSetup();
        obj.logIntoMobops();
        obj.selectEachPropertyAndSeachJob();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...