如何通过Selenium和Java定位多个元素在相同标记中具有相同id、名称和属性的元素

如何通过Selenium和Java定位多个元素在相同标记中具有相同id、名称和属性的元素,java,selenium,selenium-webdriver,xpath,webdriver,Java,Selenium,Selenium Webdriver,Xpath,Webdriver,我想识别名字列的第二个字段。如何唯一地识别第二个字段。我已经尝试了/*[@id=“depDob($index)”][2],但没有希望。这里两个名字字段都具有下面提到的相同属性 注意:这里第二个名字是隐藏的。单击复选框选项后,我们将获得第二个名字字段 你能帮我一个忙吗 <div class="seg2_formBox"> <label for="depFirstName($index)" class="formly-field-label">Firs

我想识别名字列的第二个字段。如何唯一地识别第二个字段。我已经尝试了
/*[@id=“depDob($index)”][2]
,但没有希望。这里两个名字字段都具有下面提到的相同属性

注意:这里第二个名字是隐藏的。单击复选框选项后,我们将获得第二个名字字段

你能帮我一个忙吗

<div class="seg2_formBox">
            <label for="depFirstName($index)" class="formly-field-label">First Name *
                <input id="depFirstName($index)" aria-describedby="userDepfn($index)" type="text" maxlength="15" ng-model="user.firstName" class="formly-field-input ng-pristine ng-valid ng-empty ng-valid-maxlength ng-touched" tabindex="0" ng-blur="validateUser(user, 'firstName')" ng-trim="false">
            </label>
            <span class="mbs2_formError" id="userDepfn" aria-live="polite" ng-show="user.firstNameError">Please enter a valid value for First Name</span>
        </div>

<div class="seg2_formBox">
                <label for="depFirstName($index)" class="formly-field-label">First Name *
                    <input id="depFirstName($index)" aria-describedby="userDepfn($index)" type="text" maxlength="15" ng-model="user.firstName" class="formly-field-input ng-pristine ng-untouched ng-valid ng-empty ng-valid-maxlength" tabindex="0" ng-blur="validateUser(user, 'firstName')" ng-trim="false">
                </label>
                <span class="mbs2_formError ng-hide" id="userDepfn" aria-live="polite" ng-show="user.firstNameError">Please enter a valid value for First Name</span>
            </div>

名字*
请为“名字”输入有效值
名字*
请为“名字”输入有效值

按索引选择元素(如果两个输入字段不是同一父字段的子字段),而不是

//input[@id="depFirstName($index)"][2]
试一试


如果索引一直在更改-

//input[contains(@id, 'depFirstName')][2]

您可以尝试在xpath中使用块类名,并等待它显示出来:

WebDriverWait inputField = new WebDriverWait(driver, 5);
    inputField.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div [@class='seg2_formBox']//input"))))
            .sendKeys("some_to_input");
根据您共享的HTML,属性为class=“seg2\u formBox”的两个
标记不相同。要识别字符序列并将其发送到第二个名字字段,可以使用以下解决方案:

  • 使用多个类:

  • 使用单个类:


同样,所需的元素似乎是一个元素,因此您需要诱导WebDriverWait以使所需的元素可单击。

id似乎以
depFirstName
开头。这是html的第一个字段还是第二个字段?第二个字段也有相同的HTMLcontent@ManojSoundarrajan在您共享的HTML中,我没有看到两个
名字*
字段。我遗漏了什么吗?更新了更多内容details@ManojSoundarrajan是您已发布的第二个名字字段的HTML,在单击复选框选项后复制。selenium在使用上述xpath时未标识元素。我已尝试使用selenium IDE标识元素,它本身没有标识(突出显示)元素。当我使用上述xpath时,selenium没有标识元素。您尝试实现了吗?我尝试使用selenium IDE标识元素,它本身没有标识(突出显示)元素。
是正确的HTML吗?这个HTML代码中有两个元素吗?上面的一个只识别第一个名字字段。它不接受第二个元素签出我的更新答案并让我知道关于第二个元素的结果?//div[@class='seg2\u formBox']//span[@class='mbs2\u formError']//previous::label[1]我尝试了这个xpath,但没有找到它
WebDriverWait inputField = new WebDriverWait(driver, 5);
    inputField.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div [@class='seg2_formBox']//input"))))
            .sendKeys("some_to_input");
driver.findElement(By.xpath("//div[@class='seg2_formBox']//span[@class='mbs2_formError' and not(@class='ng-hide')]//preceding::label[1]")).sendKeys("Manoj Soundarrajan");
driver.findElement(By.xpath("//div[@class='seg2_formBox']//span[@class='mbs2_formError']//preceding::label[1]")).sendKeys("Manoj Soundarrajan");