angularjs 应用程序使用 behat 的 xpath 问题

xpath issue using behat for angularjs application

我一直在尝试为我工作的公司制作一个网络爬虫,使用 behat 结合 mink 扩展。我过去也做过类似的事情,但不同的是,现在我试图抓取的页面是在 angularjs.

中构建的

这似乎导致我的 xpath 选择器出现问题,无法在 DOM.

中找到我请求的元素

为了确保我有正确的 xpath 并仔细检查它,我还使用了 chrome(扩展名)中的 Xpath Helper

我尝试使用的功能是:

/**
 * @Then I login
 */
public function login()
{
    $page = $this->getSession()->getPage();

    $username = $page->find('xpath', "//*[@id='inputEmail']/self::INPUT");
    $password = $page->find('xpath', "//*[@id='inputPassword']/self::INPUT");

    if ($username == null && $password == null) {
       echo "nothing found";
    }
    else{
        $username->setValue('username');
        $password->setValue('password');
    }
}

在我的 .feature 文件中,我可以访问登录页面并通过 "seeing" dom 中的一些文本来验证我是否在那里,以验证它是否正常工作,但是当我尝试在上面的字段中填写值,但出现错误。

我猜这是一个 angular 问题,它创建 DOM 元素的方式导致我的 xpath 无法找到我需要的字段,但我想不出解决方法这个。

当然,使用像 Protractor 这样的 JS 框架可能是一个解决方案,但我想留在 php,因为它更容易由我工作的团队维护。

欢迎任何想法。

一些想法:

  1. 使用页面对象清理代码
  2. 通过等待确保元素在使用前存在(find() 可以 return null 或元素)
  3. 如果不需要UI使用 guzzle 或使用一些无头驱动程序
  4. 如果您正在使用 UI
  5. ,请尝试为 angular 创建一个特定的等待条件