Java 如何使用没有id/名称或任何其他唯一标识符的selenium查找元素?
页面中有两个字段:用户名和密码(在下面的代码中用**突出显示)。需要使用selenium将数据输入其中。但是,除了tabIndex之外,这两个对象都有相同的标识符元素。请帮助我如何识别元素(请参考html) 请注意:下面的代码对我有用,但用户将无法看到GUI中输入的数据。我想在UI上看到数据 谢谢, 迈克 这是HTMLJava 如何使用没有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
<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使用的定位器。你可以进一步改变它
//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();