0

我一直通过 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 ) );
4

2 回答 2

2

尝试使用 XPath:

$el = $this->getSession()->getPage()->find('xpath', "//input[contains(@id,'first_name')]");
于 2013-09-28T06:48:58.363 回答
-1

在研究了更多 Xpath 并根据我对 @gontrollez 答案的评论后,它可以通过单个 Xpath 来解决:

//form[ @name = 'Register' ]//input[ contains( @id, 'username' )]

这将返回在其 id 属性上具有“用户名”的所有输入,并且输入位于其名称属性等于“注册”的任何形式内

<form>
    <input id="login_username" type="text"/>
</form>
<form name="Register>
    <div>
        <input id="other_username" type="text"/>
    </div>
</form>
</body>

这将只返回第二个输入

于 2013-10-09T15:19:34.413 回答