You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeceptJS/Protractor中使用I.attachFile?报错求助

Fixing TypeError: driver.execute is not a function with I.attachFile in CodeceptJS + Protractor

Hey there, let's tackle this file upload error you're hitting. I've dealt with similar issues in older CodeceptJS/Protractor setups, so here's what's going on and how to fix it:

The Problem Context

You're trying to run a file upload using CodeceptJS's Protractor helper with this line:

I.attachFile('input[type=file]', 'test.txt');

But you're getting the error:

TypeError: driver.execute is not a function

Your environment details:

  • chromeDriver: 2.33
  • selenium-standalone: 3.7.1
  • codeceptJS: 1.0.3

And your Protractor config snippet:

{
  "output": "./e2e/codeceptjs_tests/reports",
  "helpers": {
    "Protractor": {
      "url": "http://localhost:4200/",
      "driver": "hosted",
      "browser": "chrome",
      "rootElement": "body",
      "smartWait": 5000
    }
  }
}

Why This Happens

This error boils down to two main issues:

  1. Bug in older CodeceptJS Protractor helper: In CodeceptJS 1.0.3, when using the hosted driver mode (connecting to a standalone Selenium Server), the helper doesn't properly initialize the underlying Protractor driver object. Since I.attachFile relies on driver.executeScript under the hood, this missing method throws the error.
  2. Outdated dependency compatibility: Your chromeDriver, Selenium, and CodeceptJS versions are all pretty old. There are known compatibility gaps between these versions that can break driver initialization logic.

Solutions to Try

1. Switch to directConnect Mode (Quick Fix)

The easiest fix is to change your Protractor driver mode from hosted to directConnect. This makes Protractor connect directly to ChromeDriver instead of going through the Selenium Server, which bypasses the driver initialization bug:

Update your config like this:

"helpers": {
  "Protractor": {
    "url": "http://localhost:4200/",
    "driver": "directConnect", // Replace "hosted" with this
    "browser": "chrome",
    "rootElement": "body",
    "smartWait": 5000
  }
}

Restart your tests after making this change—I.attachFile should work as expected now.

2. Manual File Upload with Native Protractor API

If switching modes doesn't work, you can bypass CodeceptJS's attachFile entirely and use Protractor's native methods. This avoids the broken driver.execute call:

Add a custom helper function to your test:

async function uploadFile(I, selector, filePath) {
  // Grab the raw WebElement
  const fileInput = await I.grabWebdriverioElement(selector);
  // Use sendKeys to set the file path (works for file inputs)
  await fileInput.sendKeys(require('path').resolve(filePath));
}

// Use it in your scenario
Scenario('Test file upload flow', async (I) => {
  I.amOnPage('/your-upload-page');
  await uploadFile(I, 'input[type=file]', 'test.txt');
  // Add assertions or next steps here
});

This method uses the standard sendKeys approach for file inputs, which is reliable across most Protractor setups.

3. Update Dependencies (Long-Term Fix)

Since your stack is outdated, upgrading to more recent versions will eliminate this bug and prevent other compatibility issues:

  • Upgrade CodeceptJS to the latest 1.x stable release (e.g., 1.1.1) or jump to 2.x (note: some API changes apply, so check the migration guide)
  • Update ChromeDriver to match your installed Chrome browser version (ChromeDriver and Chrome major versions need to align)
  • Upgrade selenium-standalone to the latest 3.x release or switch to 4.x for better modern browser support

Verification Steps

  1. After making config/code changes, restart your Selenium server (if you were using hosted mode)
  2. Run a single test case to confirm the error is gone
  3. Check that the file is actually uploaded to your application as expected

内容的提问来源于stack exchange,提问作者Caitlyn Daisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:02:27