Behat / Mink / Selenium2元素不可见

时间:2014-10-07 15:23:38

标签: twitter-bootstrap selenium behat mink

我正在用behat编写我的测试,当我尝试在bootstrap模式内的输入上调用fillField时,我遇到了问题。 当我在此输入中发送fillField时,selenium会抛出一个异常说:

Element is not currently visible and so may not be interacted with

我手动创建了一个selenium(通过selenium IDE)测试并在同一个字段上调用了类型,它运行正常。

$page = $this->getSession()->getPage()
$page->fillField("id_item", $value);

$value是我测试中的参数。我试图调用一个函数来等待几秒钟,但它没有起作用。

更新

情景:

Scenario: Realizar Pedido de Compra
Given I am on "/"
When I fill the form with "{\"id\": 1, \"items\":[{\"id_item\": 1}]}"
Then I should see "Ok"

我的FeatureContext:

/**
 * @When I fill the form with :arg1
 */
public function iFillForm($json) {
    $formHelper = FormHelper::getInstance($this->getSession());
    $formHelper->fill($json);
}

在我的课程FormHelper中:

public function fill($json) {
    $handler = new SelectorsHandler();
    $handler->registerSelector("css", new CssSelector());
    $fileJson = json_decode($json, true);
    $page = $this->session->getPage();
    foreach ($json as $key => $value) {
       if (is_array($value)) {
          $addSubGrid = $page->find("css", "#btn-plus-" . $key);
          if ($addSubGrid != null) {
             $subGrid = $page->find("css", "#" . $key);
             $formId = $subGrid->getAttribute("data-form");
             $ok = $page->find("css", "#$formId .btn-ok");
             foreach ($value as $formItem) {
                $itemFilled = array();
                $addSubGrid->click();
                $this->session->wait(
                   1000, "$('#modal-$formId').is(':visible')"
                );
                $this->fillForm($page, array("form-item" => $formItem), $itemFilled, false);
                $ok->press();
             }
          }
       } else {
          $page->fillField($key, $value);
       }
    }

$addSubGrid var是显示模态的元素。当我执行测试时,它会打开模态,但是当它进入$page->fillField($key, $value)时它就不起作用了。

更新 我发现我试图填补一个残疾人的领域。我已启用它,现在的问题是它没有填充模态中的字段,只是外部的字段。

2 个答案:

答案 0 :(得分:2)

我已设法使用手动驱动程序中的setValue来解决此问题。似乎mink的fillField有一个bug。 我用过:

$this->session->getDriver()->setValue('//*[@id="'.$key.'"]', $value);

而不是

$page->fillField($key, $value);

答案 1 :(得分:1)

我和#34;隐藏"有同样的问题。使用"自定义图标设计的支票/收音机盒"而不是"原生组件"如此处所示http://codepen.io/jamesbarnett/pen/yILjk

我的问题的解决方案是将原生组件设置为"可见"在克服之前:

private function checkMyBox($locator)
{
    $this->getSession()->executeScript("
                var element = document.getElementById('".$locator."');
                element.style.opacity = 1;
                element.style.filter  = 'alpha(opacity=100)'; //iexplorer!
                element.style.visibility = 'visible'
            ");
    $this->getSession()->wait(2000);

    $this->getSession()->getPage()->findField($locator)->click();
}

就我而言,它是"不透明"和"可见性"但您应该检查以下css-options(检查浏览器中的字段):

visibility != hidden
display != none
opacity != 0
height and width are both > 0
type != hidden (on input fields)

我正在使用Selenium2,Behat和Mink,我希望此代码段可以帮助修复类似问题的人。