I have to extract the same table from different pages like:
class ExtractPage {
doExtraction() {
...
await page.click('#selector > li[data-period="60"]')
const extract1 = await page.$$eval('#element', tableElement => {
const data1 = tableElement.querySelectorAll('.selector1')[0].innerText.trim()
const data2 = tableElement.querySelectorAll('#id1')[0].innerText.trim()
const data3 = tableElement.querySelectorAll('#id2')[0].innerText.trim()
return { data1, data2, data3 }
})
await page.click('#selector > li[data-period="3600"]')
const extract2 = await page.$$eval('#element', tableElement => {
const data1 = tableElement.querySelectorAll('.selector1')[0].innerText.trim()
const data2 = tableElement.querySelectorAll('#id1')[0].innerText.trim()
const data3 = tableElement.querySelectorAll('#id2')[0].innerText.trim()
return { data1, data2, data3 }
})
}
}
But when i use an external function inside page.$$eval, its undefined, eg:
class ExtractPage {
function extract(element) {
const data1 = element.innerText.trim()
const data2 = element.innerText.trim()
const data3 = element.innerText.trim()
return { data1, data2, data3 }
}
doExtraction() {
...
const extract1 = await page.$$eval('#element', tableElement => {
return this.extract(tableElement[0]) // This throws an error saying this.extract is not a function
})
return extract1
}
I think this happens because the context inside page.$$eval is the browser context and so my method does not exists there, there is any way to pass it into page.$$eval, maybe there is a better solution to register my abstract method to extract data on playwright concepts?
Thanks in advance
question from:
https://stackoverflow.com/questions/66064400/what-are-the-best-practices-on-repetitive-extracting-on-playwright 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…