gpt4 book ai didi

java - 使用 WebDriver 无法通过 CSS 选择器找到 WebElement

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:26 24 4
gpt4 key购买 nike

我正在尝试访问 website 上的 WebElement单击前一个 html 元素后。当您加载网站时,您将看到一个对象网格(对于这个问题的上下文,我们将其称为卡片)。如果您在单击任何内容之前检查页面,您将看到在 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 字段在开头单击第一张卡的图标后尝试访问它的“base”属性时,我收到一条错误,该元素不存在,但 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 驱动程序及其工作正常。但是,您可以使用显式等待来代替 sleep 。 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 代替 sleep 。

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

关于java - 使用 WebDriver 无法通过 CSS 选择器找到 WebElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58381468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com