ChainSafe / dappeteer

[DEPRECATED]🏌🏼‍E2E testing for dApps using Puppeteer + MetaMask
Other
491 stars 152 forks source link

Can't Import Private Key #358

Open imacrosid opened 6 months ago

imacrosid commented 6 months ago

Describe the problem Actually I'm facing 2 problem, When I try to setup metamask it doesn't use my config (seed, password & always show testnet) but it's okay. I just want to know how to fix failed when trying to import PK. image

You think I'm doing wrong step ? Please let me know thanks.


async function task5_Week3(newPrivateKey) {
  const newSeed =
    "test test test test test test test test test test test test ";
  const DappeteerLaunchOptions = {
    metaMaskVersion: "v11.12.1",
    metaMaskPath: "metamask-chrome-11.12.1.zip",
    automation: "puppeteer",
    headless: false,
  };

  const MetaMaskOptions = {
    seed: newSeed,
    password: "Abc12345",
    showTestNets: false,
  };
  try {
    const { metaMask, browser } = await dappeteer.bootstrap(
      DappeteerLaunchOptions,
      MetaMaskOptions
    );
    const dappPage = await browser.newPage();
    await dappPage.goto("https://www.google.com");
    await metaMask.importPK(newPrivateKey);
  } catch (error) {
    console.error("Something Wrong:", error);
  }
}

Log

Something Wrong: TimeoutError: Waiting for selector `.//span[contains(.,'Eth_sign requests')]/parent::div/following-sibling::div/div/div/div|//span[contains(.,'Eth_sign requests')]/parent::div/following-sibling::div/div/label/div` failed: Waiting failed: 30000ms exceeded

System:

eugene-ray commented 6 months ago

Having the same issue and can't find a workaround so far.

jeasonnow commented 6 months ago

The current version of dappeteer supports an older version of the MetaMask extension. In the latest version, the DOM structure of the MetaMask toggle component has changed. Please refer to the snapshot for details.

from: //span[contains(.,'${text}')]/parent::div/following-sibling::div/div/label/div to: //span[contains(.,'${text}')]/parent::div/following-sibling::div/label/div

<div
      class="mm-box settings-page__content-row mm-box--display-flex mm-box--flex-direction-column"
      data-testid="advanced-setting-toggle-ethsign"
    >
      <div
        class="settings-page__content-item"
      >
        <span>
          Eth_sign requests
        </span>
        <div
          class="settings-page__content-description"
        >
          If you enable this setting, you might get signature requests that aren’t readable. By signing a message you don't understand, you could be agreeing to give away your funds and NFTs.
        </div>
      </div>
      <div
        class="settings-page__content-item-col"
      >
        <label
          class="toggle-button toggle-button--off eth-sign-toggle"
          tabindex="0"
        >
          <div
            style="display: flex; width: 52px; align-items: center; justify-content: flex-start; position: relative; cursor: pointer; background-color: transparent; border: 0px; padding: 0px; user-select: none;"
          >
            <div
              style="width: 40px; height: 24px; padding: 0px; border-radius: 26px; display: flex; align-items: center; justify-content: center; background-color: rgb(242, 244, 246);"
            >
              <div
                style="font-size: 11px; display: flex; align-items: center; justify-content: center; font-family: 'Helvetica Neue', Helvetica, sans-serif; position: relative; color: rgb(250, 250, 250); margin-top: auto; margin-bottom: auto; line-height: 0; opacity: 0; width: 26px; height: 20px; left: 4px;"
              />
              <div
                style="font-size: 11px; display: flex; align-items: center; justify-content: center; font-family: 'Helvetica Neue', Helvetica, sans-serif; position: relative; color: rgba(255, 255, 255, 0.6); bottom: 0px; margin-top: auto; margin-bottom: auto; padding-right: 5px; line-height: 0; width: 26px; height: 20px; opacity: 1;"
              />
            </div>
            <div
              style="position: absolute; height: 100%; top: 0px; left: 0px; display: flex; flex: 1; align-self: stretch; align-items: center; justify-content: flex-start;"
            >
              <div
                style="width: 18px; height: 18px; display: flex; align-self: center; box-shadow: none; border-radius: 50%; box-sizing: border-box; position: relative; background-color: rgb(106, 115, 125); left: 3px;"
              />
            </div>
            <input
              style="border: 0px; height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; width: 1px;"
              type="checkbox"
              value="false"
            />
          </div>
          <div
            class="toggle-button__status"
          >
            <span
              class="toggle-button__label-off"
            >
              OFF (Recommended)
            </span>
            <span
              class="toggle-button__label-on"
            >
              ON (Not recommended)
            </span>
          </div>
        </label>
      </div>
    </div>

The method used by the current version of dappeteer to access this toggle is as follows:

export const getSettingsSwitch = (
  page: DappeteerPage,
  text: string
): Promise<DappeteerElementHandle | null> =>
  page.waitForXPath(
    [
      `//span[contains(.,'${text}')]/parent::div/following-sibling::div/div/div/div`,
      `//span[contains(.,'${text}')]/parent::div/following-sibling::div/div/label/div`,
    ].join("|"),
    { visible: true }
  );

To fix this issue, a new XPath needs to be added://span[contains(.,'${text}')]/parent::div/following-sibling::div/label/div