Не удается найти WebElement с помощью селектора CSS с помощью WebDriver - PullRequest
1 голос
/ 14 октября 2019

Я пытаюсь получить доступ к WebElement на веб-сайте после нажатия на предыдущий HTML-элемент. Когда вы загрузите веб-сайт, вы увидите сетку объектов (которые для контекста этого вопроса давайте назовем их карточками). Если вы осмотрите страницу, прежде чем щелкнуть что-либо, вы увидите, что в разделе body > div.view > section.list.gi есть несколько элементов div, которые принадлежат классу item.card. Как вы можете видеть в моем коде ниже, я получаю первый объект карты, который принадлежит этому классу, используя селектор firstCard. Затем я вызываю метод .click(), чтобы смоделировать щелчок и ждать несколько секунд. Но после этого у меня возникли проблемы. Я хочу получить доступ к атрибуту base выбранной карты, который находится внутри тегов "body > div.overlay > div#cards"+base + " > div.one.card" div. После некоторых поисков я обнаружил, что id каждого объекта карты внутри div.overlay (после того, как пользователь нажал на карту при первой загрузке веб-сайта) - это строка cards + строка base, которую вы видитевыше. Теперь строка base является атрибутом каждого объекта карты (перед тем, как щелкнуть по нему при первой загрузке веб-сайта), поэтому я извлекаю это значение и сохраняю его в поле String base. Поэтому, когда я пытаюсь получить доступ к атрибуту «base» первой карты после нажатия на ее значок в начале, используя поле dataSelector, я получаю сообщение об ошибке, что элемент не существует, но значение dataSelector равноbody > div.overlay > div#cards1018031 > div.one.card, который выглядит хорошо для меня. Любые идеи о том, почему он не может найти элемент?

myClass.java:

    public static void main(String[] args) throws InterruptedException {

        String url = "https://dbz.space/cards/"; // The website to read data from

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setJavascriptEnabled(true);
        caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,"C:/Users/Steli/OneDrive/Documents/PhantomJS/phantomjs-2.1.1-windows/bin/phantomjs.exe");

        WebDriver driver = new PhantomJSDriver(caps);
        driver.get(url); // Connect to the url
        //WebElement button = driver.findElement(new By.ByCssSelector("body > div.view > section.more > div.content > div.btn.mat")); // Get the Show more Button element

        String firstCard = "body > div.view > section.list.gi > div.item.card";
        WebElement card = driver.findElement(By.cssSelector(firstCard));
        String base = card.getAttribute("base");

        if(isClickable(card,driver)) {
            card.click();
            Thread.sleep(5000);
            String dataSelector = "body > div.overlay > div#cards"+base + " > div.one.card";// + " > div.one.card > div.common > div.stats > div > div.stat";
            System.out.println(dataSelector);
            WebElement data = driver.findElement(By.cssSelector(dataSelector));
            System.out.println(data.getAttribute("base"));
        }

    }

PS: метод isClickable() реализован следующим образом:

private static boolean isClickable(WebElement el, WebDriver driver) {
        try{
            WebDriverWait wait = new WebDriverWait(driver, 6);
            wait.until(ExpectedConditions.elementToBeClickable(el));
            //System.out.println("clickable!");
            return true;
        }
        catch (Exception e){
            return false;
        }
    }

1 Ответ

0 голосов
/ 14 октября 2019

Я только что скопировал ваш код и вставил туда, чтобы проверить с помощью драйвера chrome и он работает нормально. Однако вместо сна вы можете использовать явное ожидание. WebDriverWait

 public static void main(String[] args) throws InterruptedException {
            // TODO Auto-generated method stub

            System.setProperty("webdriver.chrome.driver", "D:\\Software\\chromedriver.exe");
            WebDriver driver = new ChromeDriver();
            driver.get("https://dbz.space/cards/"); 
            String firstCard = "body > div.view > section.list.gi > div.item.card";
            WebElement card = driver.findElement(By.cssSelector(firstCard));
            String base = card.getAttribute("base");
            card.click();
            Thread.sleep(5000);
            String dataSelector = "body > div.overlay > div#cards"+base + " > div.one.card";// + " > div.one.card > div.common > div.stats > div > div.stat";
            System.out.println(dataSelector);
            WebElement data = driver.findElement(By.cssSelector(dataSelector));
            System.out.println(data.getAttribute("base"));

}

Вывод На моей консоли:

enter image description here


Вместо сна используйте WebDriverWait.

public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub

        System.setProperty("webdriver.chrome.driver", "D:\\Software\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.get("https://dbz.space/cards/"); 
        String firstCard = "body > div.view > section.list.gi > div.item.card";
        WebDriverWait wait = new WebDriverWait(driver, 20); 
        WebElement card=wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(firstCard)));
        String base = card.getAttribute("base");
        card.click();

        String dataSelector = "body > div.overlay > div#cards"+base + " > div.one.card";
        System.out.println(dataSelector);
        WebElement data =wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(dataSelector)));
        System.out.println(data.getAttribute("base"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...