Java 找不到mat选项selenium

Java 找不到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

我正在使用SeleniumWeb驱动程序自动化一个有角度的网站。这个网站有三个下拉列表,一个是国家,一个是省,一个是市

我知道我不能使用Select类,所以我要做的第一件事是单击mat Select元素,然后单击我想要的mat选项

问题是,有时当我运行测试时,mat选项的id、xpath或cssSelector是不同的

如何保证始终访问相同的mat选项

mat select的HTML

<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一起工作,但没有在一个组织第二:一个组织第三:一个组织