Java 找不到mat选项selenium
我正在使用SeleniumWeb驱动程序自动化一个有角度的网站。这个网站有三个下拉列表,一个是国家,一个是省,一个是市 我知道我不能使用Select类,所以我要做的第一件事是单击mat Select元素,然后单击我想要的mat选项 问题是,有时当我运行测试时,mat选项的id、xpath或cssSelector是不同的 如何保证始终访问相同的mat选项 mat select的HTMLJava 找不到mat选项selenium,java,selenium-webdriver,Java,Selenium Webdriver,我正在使用SeleniumWeb驱动程序自动化一个有角度的网站。这个网站有三个下拉列表,一个是国家,一个是省,一个是市 我知道我不能使用Select类,所以我要做的第一件事是单击mat Select元素,然后单击我想要的mat选项 问题是,有时当我运行测试时,mat选项的id、xpath或cssSelector是不同的 如何保证始终访问相同的mat选项 mat select的HTML <mat-select _ngcontent-c16="" class="mat-select ng-tn
<mat-select _ngcontent-c16="" class="mat-select ng-tns-c19-42 ng-pristine ng-valid ng-star-inserted ng-touched" formcontrolname="country" placeholder="Seleccione un país" role="listbox" id="mat-select-5" tabindex="0" aria-label="Seleccione un país" aria-required="false" aria-disabled="false" aria-invalid="false" aria-multiselectable="false">
<div class="mat-select-trigger" aria-hidden="true" cdk-overlay-origin="">
<div class="mat-select-value">
<!----><span class="mat-select-placeholder ng-tns-c19-42 ng-star-inserted">Seleccione un país</span>
<!---->
</div>
<div class="mat-select-arrow-wrapper">
<div class="mat-select-arrow"></div>
</div>
</div>
<!---->
</mat-select>
这是可行的,但是mat选项并不总是具有相同的行为(有时cssLocator不同,id和xpath也不同),因此当出现这种情况时,测试不会选择我想要的国家,而是选择另一个国家。如果您的选项总是以相同的顺序出现在页面上,您可以使用它来选择您想要的国家 例如,要选择第三个选项:
WebElement dropdown = driver.findElement(By.xpath("(//mat-option)[3]"));
如果您的选项总是以相同的顺序出现在页面上,则可以使用该顺序选择所需的选项 例如,要选择第三个选项:
WebElement dropdown = driver.findElement(By.xpath("(//mat-option)[3]"));
mat-select
显然有一个ID,ID=“mat-select-5”
,因此这应该是您进行选择的第一选择。对于选项,如果ID正在更改,我们必须找到另一种方法来定位它们。由包含的文本开始似乎是一件好事
driver.findElement(By.id("mat-select-5")).click(); // opens the dropdown
driver.findElement(By.xpath("//mat-option/span[contains(.,'ESPAÑA')]")).click(); // clicks on 'ESPAÑA' option
我建议您将其放入一个函数中,您可以使用该函数设置国家/地区下拉列表,然后输入您要选择的国家/地区名称。然后,您可以将其构建到第二次单击中,并将其用于任何国家
public void selectCountry(String countryName)
{
driver.findElement(By.id("mat-select-5")).click();
driver.findElement(By.xpath("//mat-option/span[contains(.,'" + countryName + "')]")).click();
}
然后你会这样称呼它
selectCountry("ESPAÑA");
mat-select
显然有一个ID,ID=“mat-select-5”
,因此这应该是您进行选择的第一选择。对于选项,如果ID正在更改,我们必须找到另一种方法来定位它们。由包含的文本开始似乎是一件好事
driver.findElement(By.id("mat-select-5")).click(); // opens the dropdown
driver.findElement(By.xpath("//mat-option/span[contains(.,'ESPAÑA')]")).click(); // clicks on 'ESPAÑA' option
我建议您将其放入一个函数中,您可以使用该函数设置国家/地区下拉列表,然后输入您要选择的国家/地区名称。然后,您可以将其构建到第二次单击中,并将其用于任何国家
public void selectCountry(String countryName)
{
driver.findElement(By.id("mat-select-5")).click();
driver.findElement(By.xpath("//mat-option/span[contains(.,'" + countryName + "')]")).click();
}
然后你会这样称呼它
selectCountry("ESPAÑA");
在下拉元素上执行单击操作后,它会呈现一些html并导致更改其属性,但仍有一些属性未更改,如
占位符
使用xath使用占位符单击城市下拉元素
driver.findElement(By.xpath("//mat-select[@placeholder='Seleccione un país']").click();
现在,为了确保选项元素可见并可供单击,可以使用wait进行检查
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()=' ESPAÑA ']")));
driver.findElement(By.xpath("//span[text()=' ESPAÑA ']").click();
希望这有帮助在对下拉元素执行单击操作后,它会呈现一些html并导致更改其属性,但仍有一些属性未更改,如
占位符
使用xath使用占位符单击城市下拉元素
driver.findElement(By.xpath("//mat-select[@placeholder='Seleccione un país']").click();
现在,为了确保选项元素可见并可供单击,可以使用wait进行检查
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[text()=' ESPAÑA ']")));
driver.findElement(By.xpath("//span[text()=' ESPAÑA ']").click();
希望这有助于添加html代码剪贴而不是屏幕截图这是一种糟糕的做法人们如何编写html代码来重现您的java问题您是指整个网站的html代码吗?不,您在屏幕截图中突出显示的元素仅此而已:)好,然后就准备好了:)我编辑并添加信息:)添加html代码剪贴而不是截图这是一种糟糕的做法人们如何编写html代码来重现java问题你是说整个网站的html代码吗?不,你在截图中突出显示的元素只有这些:)好的,然后准备好:)我编辑并添加信息:)选项的顺序总是相同的,但Xpath并不总是相同的,例如,对于第一个我得到3个不同的国家。我试过使用cssSelector,但没有使用AFGANISTÁN Second:AFGANISTÁN Third:AFGANISTÁN选项的顺序总是相同的,但Xpath并不总是相同的,例如,对于我得到的第一个国家,有3个不同的。我试过和cssSelector一起工作,但没有在一个组织第二:一个组织第三:一个组织