Selenium,如何单击没有ID的具有动态xpath的元素

问题描述

我看到有几个与此类似的问题,但对我来说都是可行的。 我正在使用一些Java机器人,现在我在一个地方堆叠:/试图用动态xpath拾取并单击日历日期

//*[@id="root"]/div/div[1]/div[2]/div[1]/div/div/div/div[3]/div/span/div/div/div/div/div/div[2]/div[2]/div[3]/div[3]/div[1]

元素就是这样

<div class="DayPicker-Day DayPicker-Day--isdisabled" tabindex="-1" role="gridcell" aria-label="Mo. 9. Nov 2020" aria-disabled="false" aria-selected="false">9</div>

我用aria-label找到了这个想法 我现在的代码

                Calendar cal = Calendar.getInstance();
                cal.set(Calendar.YEAR,Integer.valueOf(params.getFraAar()));
                cal.set(Calendar.MONTH,Integer.valueOf(params.getFraMnd()) - 1);
                cal.set(Calendar.DAY_OF_MONTH,Integer.valueOf(params.getFraDag()));
                cal.add(Calendar.DAY_OF_MONTH,1);

                SimpleDateFormat format1 = new SimpleDateFormat("EEE. d. MMM yyyy",Locale.GERMAN);
                String fraDato = format1.format(cal.getTime());

                WebElement fraDatoElement = driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[1]/div[2]/div[1]/div/div/div/div[2]/div[1]/div[2]/div[1]/div/div[1]/div"));
                fraDatoElement.click();

                WebElement fraDatoWeb = driver.findElement(By.xpath("//*[@id=\"root\" and contains(@class=\"DayPicker-Day\") and contains(@aria-label='" + fraDato + "')]"));
                fraDatoWeb.click();

我不知道该怎么办:/一直以来我都没有这种元素异常。

解决方法

尽量不要使用您所描述的xpath。而是使用缩短的相对路径。由于DOM树可以在任何地方更改,因此将阻止获取NoSuchElementException

此外,此xpath错误:

WebElement fraDatoWeb = driver.findElement(By.xpath("//*[@id=\"root\" and contains(@class=\"DayPicker-Day\") and contains(@aria-label='" + fraDato + "')]"));

应为:

WebElement fraDatoWeb = driver.findElement(By.xpath("//*[@id='root' and contains(@class,'DayPicker-Day') and contains(@aria-label,'" + fraDato + "')]"));