Щелчок с использованием Xpath не работает при вызове из функции в кукольнике

При попытке щелкнуть элемент с помощью $ x возникает ошибка. Пробовал разные способы, но не повезло, может ли кто-нибудь сообщить мне, в чем ошибка с приведенным ниже кодом или любым другим способом щелкнуть с помощью xpath.

 Error: Protocol error (Runtime.callFunctionOn): Target closed.

ниже код

//commonfunction.ts

module.exports = {};

module.exports.ToggleButton = async function ToggleButton(Question, QuestionLabelXpath) {
      await page.waitForXPath(QuestionLabelXpath + "/descendant::label[text()='" + Question + "']/parent::div/descendant::button[@title='Edit']");
      const editIcon = await page.$x(QuestionLabelXpath + "/descendant::label[text()='" + Question + "']/parent::div/descendant::button[@title='Edit']");
      await editIcon[0].click();};

//questions.ts

const CommFun = require('./commonfunction');
    test('Verify "question"',async() => {
    CommFun.ToggleButton("question","//div[@role=\'tabpanel\']/div/div/div/div/div")
    },30000);

Пробовал $$ eval в тесте, щелчок работает, но когда я помещаю его в функцию, он не работает, должен ли он что-то делать с вызовом функции?

const CommFun = require('./commonfunction');
test('Verify "question"',async() => {
await page.$$eval('button[title=\'Edit\']', elements => elements[1].click());
},30000);

person Vincent    schedule 16.12.2019    source источник
comment
Вы добавляете await browser.close() или await page.close() в конце кода?   -  person Edi Imanto    schedule 16.12.2019
comment
@EdiImanto я использую afterAll (() = ›{browser.close ();});   -  person Vincent    schedule 16.12.2019
comment
@EdiImanto, даже после смены браузера afterAll (async () = ›{await browser.close ();}); все еще возникает та же проблема   -  person Vincent    schedule 16.12.2019
comment
Я думаю, вам следует предоставить более подробный код, чем просто раздел, как указано выше. Также попробуйте щелкнуть элемент в await elementHandle.evaluate( node => node.click() )   -  person Edi Imanto    schedule 17.12.2019
comment
@EdiImanto, я обновил код, чтобы он соответствовал сценарию, и также попробовал $$ eval в тесте и функции. Работает в тесте, но не работает, когда код работает.   -  person Vincent    schedule 17.12.2019
comment
Я добавил еще один ответ ниже   -  person Edi Imanto    schedule 17.12.2019


Ответы (2)


Попробуйте поставить ожидание в вызове функции, вот так.

const CommFun = require('./commonfunction');
    test('Verify "question"',async() => {
    await CommFun.ToggleButton("question","//div[@role=\'tabpanel\']/div/div/div/div/div")
    },30000);
person Edi Imanto    schedule 17.12.2019
comment
такой простой, но эффективный, теперь мой код заработал. Спасибо. Я изменю вопрос, чтобы об этом узнали и другие - person Vincent; 17.12.2019
comment
с удовольствием: D. - person Edi Imanto; 17.12.2019

Как я видел в приведенном выше коде, вы допустили опечатку в имени переменной const QuestionLableXpath. Затем вы использовали правильное имя QuestionLabelXpath, поэтому они не совпадают. Попробуйте исправить имя и посмотрите, как будет выглядеть результат.

person Tom Nguyen    schedule 17.12.2019
comment
спасибо, что указали на это, это была моя опечатка при создании этого вопроса, сейчас исправлена. В моем реальном тестировании я передаю это как параметр функции. Код не работает при этой операции щелчка. - person Vincent; 17.12.2019