Java 尝试使用CssSelector时在Selenium webdriver中发现NoTouchElementException

Java 尝试使用CssSelector时在Selenium webdriver中发现NoTouchElementException,java,selenium,selenium-webdriver,css-selectors,nosuchelementexception,Java,Selenium,Selenium Webdriver,Css Selectors,Nosuchelementexception,我正在尝试使用cssSelector而不是xpath。我打开了CNN的网站,把政治的观点放在首位。然后尝试使用cssSelector选择它。我无法找出我所写的cssSelector中的错误。我没有什么例外 线程主org.openqa.selenium.NoSuchElementException中的异常:没有这样的元素:无法定位元素:{method:css选择器,选择器:[id='nav']div:nth-child2 div:nth-child2 a:nth-child3} 这是密码 WebD

我正在尝试使用cssSelector而不是xpath。我打开了CNN的网站,把政治的观点放在首位。然后尝试使用cssSelector选择它。我无法找出我所写的cssSelector中的错误。我没有什么例外


线程主org.openqa.selenium.NoSuchElementException中的异常:没有这样的元素:无法定位元素:{method:css选择器,选择器:[id='nav']div:nth-child2 div:nth-child2 a:nth-child3}

这是密码

WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
driver.get("http://cnn.com");
//driver.findElement(By.xpath("//*[@id='nav']/div[2]/div[2]/a[3]")).click();
driver.findElement(By.cssSelector("*[id='nav'] div:nth-child(2) div:nth-child(2) a:nth-child(3)")).click();
选择器中的第二个div:nth-child2实际上应该是div:nth-child3,第一个标记也是子标记。您也不应该将*与cssSelctor一起使用

您还可以使用类导航菜单链接作为起点

driver.findElement(By.cssSelector("[class='nav-menu-links'] a:nth-child(2)")).click();
或部分数据分析标题属性

driver.findElement(By.cssSelector("[data-analytics-header*='main-menu_politics']")).click();

我是CSS选择器的主要支持者,而不是其他任何东西,但在这种情况下,我可能会使用链接文本而不是CSS选择器。之后,我将使用类似于//div[@id='nav']//a[.='Politics']的XPath。如果我必须使用CSS选择器,我会使用[data analytics header='main-menu_politics'。

首先,如果可能的话,避免:第n个子元素,而是使用类、ID或其他或多或少明确的属性来查找元素

例如,您提供的XPath将我指向cnn.com上的金钱部分,而不是政治部分

您应该使用[data analytics header='main-menu_politics']或.nav-menu-links__链接[href='/politics']


此外,您可以使用nav代替*[id='nav'],使用.CLASSNAME代替[class='CLASSNAME']。在.

上有一个关于css选择器的简单概述,您可以在thread main org.openqa.selenium.NoSuchElementException中发布logsException:没有这样的元素:无法定位元素:{method:css选择器,选择器:[id='nav']div:nth-child2 div:nth-child2 a:nth-child3}1。你真的有4个孩子吗?第n个子编号从0开始,而不是从1开始。JS是静态加载还是动态加载元素?静态。xPAth不会改变。我尝试使用编号为0的第n个孩子。driver.findElementBy.cssSelector*[id='nav']div:nth-child1 div:nth-child1 a:nth-child2.click;但我还是得到了错误。我要做的就是单击取自xPathWell中给定的同一根元素的Politics部分,当我跟踪HTML时,CSSSelector不遵循与xPath相同的规则。嗯,该元素给我的是World部分,而不是Politics。@Chetu19不一定。@Chetu19您需要的是:nth-child2,不是:nth-child3。这在我的答案中。使用*没有什么错。在这种情况下你不需要它,但即使它在那里也不会伤害任何人。
driver.findElement(By.cssSelector("[data-analytics-header*='main-menu_politics']")).click();