尽管可以看到该字段,但 Webdriver $I->fillField 的代码无法正常工作

Codeception with Webdriver $I->fillField not working although the field is seen

作为 Codeception 的新手,我遇到了以下代码的问题:

$I->click("a.slideout-toggle-add-employee");
$I->wait(2);
$I->seeElement(Locator::find('input', ['placeholder' => 'Vorname']));
$I->fillField(Locator::find('input', ['placeholder' => 'Vorname']),"Testerina");
$I->wait(2);

运行codecept run时的输出是这样的:

 I click "a.slideout-toggle-add-employee"
 I wait 2
 I see element "//input[@placeholder = 'Vorname']"
 I fill field "//input[@placeholder = 'Vorname']","Testerina"
  Screenshot and page source were saved into '...' dir
 ERROR 

在我的设置中,我使用 selenium-standalone 和以下配置:

class_name: AcceptanceTester
actor: AcceptanceTester
modules:
  enabled:
    - WebDriver:
        url: 'http://localhost:19080/'
        browser: chrome
        host: '127.0.0.1'
        port: 4444
        restart: false
        window_size: 1920x1080
    - \Helper\Acceptance
    - Asserts

在类似的问题中,我读到 fillField 可能是 PhpBrowser 的问题,但这并没有回答我的问题:seeInField finds the element, while fillField doesn't - CodeCeption

可能是通过页面内的 ajax 传送的,但是由于使用定位器找到了元素,所以我不明白哪里出了问题。我错过了什么?

终于找到了答案 - 有一些未知的隐藏元素匹配了同一个选择器,这个元素导致了异常:

[Facebook\WebDriver\Exception\ElementNotInteractableException] element not interactable.

我发现使用 grabMultiple 函数:

print_r($I->grabMultiple(Locator::find('input', ['placeholder' => 'Vorname'])));

解决方案是使用更具体的选择器:

$I->fillField('.employees-list input[name="user_firstname"]',"Testerina");