我一直在通过Behat | Mink工作BDD。
但是,如果输入(字段)不完整,我就无法找到带有ID或名称的输入(字段)。
我打算做以下事情:
$field = $this->getSession()->getPage()->findField( "*first_name*" );
其中'*'表示可以是那里的任何字符串。
问题是我有一个案例,我无法确切知道完整的ID原因:
id="<random-string>_<actual-field-name>_<random-number>"
知道我该怎么办?
我尝试过什么
- get it through label (for some reasons there are some labels that dont have 'for' attribute and sometimes the name is a sentence and not an simple name)
- get it through css/classes (to many variables)
编辑:
我创建了一个php函数来读取属性并返回目标属性的值。
/**
*
* @param string $haystack The complete html
* @param string $needle The string with the part of the attribute value
* @param string $tag The tag of where the attribute should belong
* @param string $attr The attribute to ifnd
* @return string
*/
protected function findCompleteAttribute( $haystack, $needle, $tag = null, $attr = 'id' )
但是,如果有另一个字段(例如:隐藏登录表单)并且针也在这些输入中,如果它们是第一个,它将获得它们。
所以我需要指定表单,但是,再一次,我无法通过名称找到表单:
$field = $this->getSession()->getPage()->find( 'named', array( 'form', $formName ) );
答案 0 :(得分:2)
尝试使用XPath:
$el = $this->getSession()->getPage()->find('xpath', "//input[contains(@id,'first_name')]");
答案 1 :(得分:-1)
在研究了更多Xpath之后,基于我对@gontrollez的评论,它可以通过一个Xpath解决:
//form[ @name = 'Register' ]//input[ contains( @id, 'username' )]
这将返回在其id属性上具有“username”的所有输入,并且输入位于其name属性等于“Register”的任何形式内
<form>
<input id="login_username" type="text"/>
</form>
<form name="Register>
<div>
<input id="other_username" type="text"/>
</div>
</form>
</body>
这将只返回第二个输入