Java 如何使用没有id/名称或任何其他唯一标识符的selenium查找元素?

Java 如何使用没有id/名称或任何其他唯一标识符的selenium查找元素?,java,selenium,selenium-rc,selenium-webdriver,Java,Selenium,Selenium Rc,Selenium Webdriver,页面中有两个字段:用户名和密码(在下面的代码中用**突出显示)。需要使用selenium将数据输入其中。但是,除了tabIndex之外,这两个对象都有相同的标识符元素。请帮助我如何识别元素(请参考html) 请注意:下面的代码对我有用,但用户将无法看到GUI中输入的数据。我想在UI上看到数据 谢谢, 迈克 这是HTML <form action="/vito-mma/activateLogin.do" method="post" name="loginForm"> <input

页面中有两个字段:用户名和密码(在下面的代码中用**突出显示)。需要使用selenium将数据输入其中。但是,除了tabIndex之外,这两个对象都有相同的标识符元素。请帮助我如何识别元素(请参考html)

请注意:下面的代码对我有用,但用户将无法看到GUI中输入的数据。我想在UI上看到数据

谢谢, 迈克

这是HTML

<form action="/vito-mma/activateLogin.do" method="post" name="loginForm">
<input type="hidden" value="vitocom" name="cams_security_domain">
<input type="hidden" value="/vito-mma/showPlans.do" name="cams_original_url">
<input type="hidden" value="http" name="cams_login_config">
<input type="hidden" value="" name="cams_cb_partner">
<fieldset class="mma-signin">
<div class="clearfix">

<**input class="bigtext e-hint" type="text" value="" name="e_hint_dummy_input" size="25" autocomplete="off" tabindex="1" style="display: inline;"**>

<input class="bigtext e-hint" type="text" title="Email address" value="" tabindex="1" size="25" name="cams_cb_username" style="display: none; background-color: rgb(255, 255, 255);" autocomplete="off">
</div>
<div class="clearfix">

<**input class="bigtext e-hint" type="text" value="" name="e_hint_dummy_input" size="25" autocomplete="off" tabindex="2"**>

<input class="bigtext e-hint" type="password" title="Password" value="" tabindex="2" size="25" name="cams_cb_password" style="display: none; background-color: rgb(255, 255, 255);" autocomplete="off">
</div>
</fieldset>
<div class="indent">
</form>

注意: 尝试使用Xpath:无效。
用IDE记录用户名,(name=“cams\u cb\u username”)。使用此选项-也不起作用。

对于这些类型的字段,使用Xpath很好。因为我也是Xpath新手,所以我有办法做到这一点:

  • 安装并单击(并键入)要键入的字段
  • 在selenium IDE中,您将看到IDE使用的定位器。你可以进一步改变它
xpath看起来像
//input/div
或类似的东西。我不太清楚,我是个新手

然后在代码中使用

@FindBy(xpath="/the/xpath/provided/by/selenium_ide")
编辑

看到这张图了吗

在这里,我使用Selenium IDE创建了一个简单的测试任务-打开您的问题,单击搜索框并键入“搜索”


在最后一个命令中,IDE向我提出了最明显的定位器解决方案。但是我可以改变这一点。

您可以自定义xpath以使用
tabindex
属性和
name
属性:

@FindBy(xpath="\\input[@name='cams_cb_username' and @tabindex='1']")
private WebElement emailId;

@FindBy(xpath="\\input[@name='cams_cb_password' and @tabindex='2']")
private WebElement password;
或者,您也可以使用以下内容:

WebElement username = wait.until(presenceOfElementLocated(By.xpath("\\input[@name='cams_cb_username' and @tabindex='1']")));
WebElement password = driver.findElement(By.xpath("\\input[@name='cams_cb_password' and @tabindex='2']"));
username.clear();
username.sendKeys(username);
password.clear();
password.sendKeys(password);
password.submit();

希望这能有所帮助。

首先,在你的帖子上,你标记了两个与描述中不同的输入(
@FindBy(name=“cams\u cb\u username”)
@FindBy(name=“cams\u cb\u password”)

但是,对于您用
**
标记的内容,相应的CSS选择器是:

  • 第一个:
    .clearfix:n子(1)输入[name=“e\u hint\u dummy\u input”]

  • 第二个:
    .clearfix:n子(2)输入[name=“e\u hint\u dummy\u input”]


  • 您可以直接使用名称来定位元素:例如 1.对于usrname使用:selenium.type(“cams_cb_用户名”,“您的UN”); 2.密码使用:selenium.type(“cams_cb_密码”、“您的密码”); 或者你也可以使用类似于: 用户名://input[@name='cams_cb_username']; 对于PWD://input[@name='cams_cb_password']


    这些应该有用。

    谢谢你的建议。我在问题中添加了一个注释。我已经尝试过了,但它对我不起作用。谢谢你的回答。正如我在第一篇文章中所说的,我确实使用了xpath,它不起作用!!虽然这行没有抛出任何错误,但它已成功执行,但在GUI中-没有输入任何内容se字段。完全尝试了您提到的内容。我得到以下错误:元素当前不可见,因此可能无法交互with@Mike这是因为这两个输入设置了
    display:none
    样式。您是否尝试将
    name
    属性设置为
    cams\u cb\u username
    cams\u cb\u username
    或标有**?:我试过使用这个:@FindBy(xpath=“\\input[@tabindex='1']”)-它不起作用…然后我试过使用绝对xpath(//form/fieldset/div[1]/input[1])-即使这样也不起作用。但是,当我使用带有@FindBy(name=“cams\u cbu username”)的Javascript executor时-有效。但字段中输入的数据不可见。它直接设置到变量中。我希望它也可见。@Mike您有两个tabindex=1的输入项。您需要指定另一个属性来标识单个属性。请尝试使用名称。如果您试图在exa中选择标记为**的输入,请例如,您可以使用
    \\input[@name='e\u hint\u dummy\u input'和@tabindex='2']
    一般问题-您的登录表单是否公开,以便我们可以尝试并提供更好的解决方案?不幸的是,否。我为客户工作,如果我在此处共享任何信息,将违反合同。谢谢您的提问。您尝试过CSS选择器吗?不确定在这种情况下如何确定CSS选择器。请您帮助我e?我对CSS定位器的使用知之甚少顺便说一句,你在这里有四个输入,你根据你的描述选择了两个不正确的输入。@loan.谢谢你。你是对的。也许我应该重新措辞这个问题。这些帖子中建议的XPath和CSS都是正确的,但当我运行它时-它不是正在工作…但当我使用Javascript执行器并执行以下操作时:((JavascriptExecutor)DriverFactory.getDriver()).executeScript(“参数[0].setAttribute('value',参数[1]);”,emailId,“username”);((JavascriptExecutor)DriverFactory.getDriver()).executeScript(“参数[0].setAttribute('value',参数[1]);”,密码,“pwd”);它可以工作。但是用户无法看到在GUI对象上输入的数据顺便问一句,为什么要将“value”设置为“username”和“pwd”?@loan:我尝试了你的建议-它不起作用。“username”和“pwd”是loginWell的凭据,试着按照AxxA Osiris在第二种方法中所说的那样做:driver.findelee(By.cssSelector(…).sendkeys(“密码/用户名”);
    WebElement username = wait.until(presenceOfElementLocated(By.xpath("\\input[@name='cams_cb_username' and @tabindex='1']")));
    WebElement password = driver.findElement(By.xpath("\\input[@name='cams_cb_password' and @tabindex='2']"));
    username.clear();
    username.sendKeys(username);
    password.clear();
    password.sendKeys(password);
    password.submit();