【问题标题】:Can't find WebElement with a CSS selector using WebDriver使用 WebDriver 找不到带有 CSS 选择器的 WebElement
【发布时间】:2020-02-11 08:31:35
【问题描述】:

在单击前一个 html 元素后,我正在尝试访问 website 上的 WebElement。当您加载网站时,您会看到一个对象网格(对于这个问题的上下文,我们称它们为卡片)。如果您在单击任何内容之前检查页面,您会看到在body > div.view > section.list.gi div 下,有多个属于item.card 类的div。正如您在下面的代码中看到的,我使用firstCard 选择器获得了属于该类的第一个卡片对象。然后我调用.click() 方法来模拟点击并等待几秒钟。在那之后,我遇到了麻烦。我想访问位于"body > div.overlay > div#cards"+base + " > div.one.card" div 标签内的所选卡片的base 属性。经过一番搜索,我发现div.overlay中每个卡片对象的id(在网站首次加载时用户点击卡片之后)是字符串cards+您看到的base字符串更多。现在base 字符串是每个卡片对象的属性(在首次加载网站时单击它之前),所以我检索该值并将其存储在String 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"));
        }

    }

P.S: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;
        }
    }

【问题讨论】:

  • 您的代码在 chrome WebDriver 上运行良好。
  • @KunduK 能否请您使用 ChromeDriver 发布代码?

标签: java selenium selenium-webdriver css-selectors


【解决方案1】:

我刚刚复制了您的代码并粘贴到那里以检查 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"));

}

在我的控制台上输出:


使用 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"));
}

【讨论】:

  • 嗯,我有同样的事情,但我得到了一个 Timed out connecting to chrome..Retrying.. 和一个例外 Exception in thread "main" java.lang.NoSuchMethodError: 'org.openqa.selenium.remote.http.HttpClient$Factory org.openqa.selenium.remote.http.HttpClient$Factory.createDefault()'。我已将驱动程序路径设置为可执行文件,并且 chrome 是最新版本。这是否意味着没有默认构造函数?
  • 下载最新的 selenium jar 并将这些 jar 添加到构建路径中。
  • 我安装了 3.141.59 版本,这是最新的客户端版本吗?至少从我在他们网站上看到的来看
  • 是的,你是对的,一个是最新的。所以你有 chrome 驱动程序和 chrome 版本都是最新的,对吗?
  • 是的,chrome 驱动程序和 chrome v. 77.0.3865.120
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多