Java Selenium webdriver如何单击列表中的按钮

Java Selenium webdriver如何单击列表中的按钮,java,list,selenium,xpath,Java,List,Selenium,Xpath,我想用SeleniumWebDriver和java在列表中单击一个按钮,就像下面的图片一样。 我用li的id试过了,但不起作用: WebElement slick0 = driver.findElement(By.id("slick-slide00")); wait.until(ExpectedConditions.visibilityOf(slick0)); slick0.click(); 我尝试使用xpath,但使用firepath得到的xpath也不起作用:

我想用SeleniumWebDriver和java在列表中单击一个按钮,就像下面的图片一样。 我用li的id试过了,但不起作用:

    WebElement slick0 = driver.findElement(By.id("slick-slide00"));
    wait.until(ExpectedConditions.visibilityOf(slick0));
    slick0.click();
我尝试使用xpath,但使用firepath得到的xpath也不起作用:

    WebElement slick1 = driver.findElement(By.xpath(".//*[@id='slick-slide01']/button"));

    System.out.println("click sign");
    slick1.click();
这就是我在控制台里看到的

Element info: {Using=xpath, value=.//*[@id='slick-slide01']/button}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:671)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:410)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:509)
at org.openqa.selenium.By$ByXPath.findElement(By.java:361)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:402)
at ChromeTests.FirstChrome.main(FirstChrome.java:32)
有人能告诉我应该选择哪个选择器和从哪里选择吗

多谢各位

您可以尝试下面的代码,您可能需要尝试我将尝试介绍的几种不同的内容。由于完整的DOM和页面实际上不可用,所以我没有测试下面的代码

整个想法是首先尝试获取外部div,其中包含“ul”和“li”标签。下面是我试图定位外部父div的代码

public WebElement getOuterDiv(){
          return  driver.findElement(By.xpath("//div[contains(@class, 'slick-list draggable')]"));
        }
现在,如果外部div 你能找到它,那就太好了,否则试着去一层 上面用于定位div class“滑溜启动滑溜滑块”

一旦你有了外部div,然后尝试定位内部的“ul”和“li”类。下面是定位我们已经定位的外部div类的内部元素的代码

public void getUlElement(){
            getOuterDiv().findElement(By.className("slick-dots")).findElement(By.id("slick-slide01")).click();
        }
下面是对上述代码的解释,以及在找不到内部类名的情况下需要执行的操作

getOuterDiv().findElement(By.className(“光滑点”)) 在外部类的帮助下,我试图找到外部div类的内部元素,它是一个。如果findElement(按.className(“光滑点”))有效,则继续操作,否则尝试使用findElement(按.tagname(“ul”))定位标记名的内部

最后单击最里面的带有id的“li”标记。 findElement(By.id(“slick-slide01”)。单击()


如果您需要任何帮助或任何步骤不清楚或不起作用,请告诉我。

我不认为这是一个与定位器相关的问题,我遇到了一个类似的问题,定位器是正确的,但selenium无法执行单击。在这种情况下,我使用了Javascript,它成功了,我能想到的另一个原因是,要单击的元素位于框架中,而您创建的定位器指向默认框架中的元素

您可以获得元素列表,如下所示:

public static List<WebElement> listElements(){
            return driver.findElements(By.xpath("//li[starts-with(@id, 'slick-slide')]"));
        }
公共静态列表列表元素(){
返回driver.findElements(By.xpath(//li[以(@id,'slick slide')]开头]);
}
然后,您可以使用for循环遍历数组中的每个元素,或者使用
liselements()。获取(i)
,其中“i”是该列表中所需的任何按钮。
请注意,我无法测试它,因此您可能需要对定位器进行一些操作,但理论应该是正确的(它在许多情况下对我有效)。

您的意思是它不起作用?你得到TimeoutException还是NoTouchElementException?按钮没有点击,我没有得到任何错误。我添加了控制台中显示的内容。请看一看,谢谢。