如何使用没有id / name或任何其他唯一标识符的selenium定位元素?

时间:2012-11-14 13:00:40

标签: java selenium selenium-rc selenium-webdriver

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

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

谢谢, 麦克

@FindBy(name="cams_cb_username")
private WebElement emailId;

@FindBy(name="cams_cb_password")
private WebElement password;   
((JavascriptExecutor)DriverFactory.getDriver()).executeScript("arguments[0].setAttribute('value',arguments[1]);", emailId, "username");
((JavascriptExecutor)DriverFactory.getDriver()).executeScript("arguments[0].setAttribute('value',arguments[1]);", password, "pwd");

这是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_cb_username”)。用过这个 - 也没用。

4 个答案:

答案 0 :(得分:2)

对于那些类型的字段,使用Xpath很好。因为我也是Xpath新手,有办法,我是怎么做到的:

  • 安装Selenium IDE并点击(并键入)您要输入的字段
  • 在selenium IDE中,您将看到IDE使用的定位器。您可以进一步更改

xpath看起来像//input/div或类似的东西。我不确切知道,这里我真的是新手

在代码中,然后使用

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

修改

看到这张图片 enter image description here

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

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

答案 1 :(得分:2)

您可以自定义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();

希望这有帮助。

答案 2 :(得分:1)

首先,在您的帖子上,您标记的输入与您在说明中的输入不同(@FindBy(name="cams_cb_username")&amp; @FindBy(name="cams_cb_password")

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

  1. 第一个:.clearfix:nth-child(1) input[name="e_hint_dummy_input"]

  2. 第二个:.clearfix:nth-child(2) input[name="e_hint_dummy_input"]

答案 3 :(得分:0)

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

这些应该有用。