cy.type() 只能接受字符串或数字。你传入:undefined
cy.type() can only accept a string or number. You passed in: undefined
我正在尝试使用 CSV 文件填写 HTML 表单。对于他们,我首先将 CSV 文件转换为 JSON,然后尝试使用 JSON 文件填写表格。但是,我唯一得到的是错误:cy.type() can only accept a string or number。您传入:undefined
我已经检查了针对同一问题给出的答案,但找不到对我有帮助的答案。我做错了什么?
这里我留下了我首先将文件从 CSV 传递到 JSON 的代码,然后它被记录在控制台中,最后我通过表单传递它:
<!-- language: js -->
import {parse} from "papaparse"
describe('Convert CSV file in JSON file', function(){
let allData
before(()=>{
cy.readFile('C:/data/cypress/downloads/generatedBy_react-csv.csv')
.then(str =>{
cy.writeFile('C:/data/cypress/fixtures/testDataFromCSV.json', parse(str, {header:true}))
})
cy.fixture('testDataFromCSV.json')
.as('dataJson')
.then(dataJson => {
allData = dataJson
})
})
it('Log the data from the CSV to the JSON file', function(){
allData.data.forEach(data =>{
cy.log(data.firstName)
cy.log(data.lastName)
cy.log(data.email)
cy.log(data.age)
cy.log(data.address)
cy.log(data.vehicle)
cy.log(data.phoneNo)
})
})
it('Use JSON Data in hte HTML form', function(){
allData.data.forEach(data =>{
cy.visit('http://localhost/2iTesting/form.html')
cy.fixture("testDataFromCSV.json")
.then((dataJson)=>{
allData = JSON.stringify(dataJson)
cy.get('[cy-data="firstname"]')
.type(data.firstName)
cy.get('[cy-data="lastname"]')
.type(data.lastName)
cy.get('[cy-data="email"]')
.type(data.email);
cy.get('[cy-data="address"]')
.type(data.address);
cy.get('[cy-data="vehicle"]')
.type(data.vehicle);
cy.get('[cy-data="submit"]')
.click()
cy.wait(1500)
})
})
})
})
问题在于您的 then 块的范围。在这个夹具的 then 块内。 cy.fixture('testDataFromCSV.json').as('dataJson').then(dataJson => { allData = dataJson})
allData = dataJson
但在 then 块之外 alldata
= let alldata
或者只是未定义。要访问分配的变量,您需要使用 cy.wrap()
.
cy.fixture('testDataFromCSV.json').as('dataJson')
.then( (dataJson) => {
cy.wrap(dataJson).as(allData)
}
然后要访问您包装的对象,您只需执行以下操作。
it('Log the data from the CSV to the JSON file', () =>{
cy.get('@allData')
.then( (allData) => {
Object.Values(allData.data).forEach( (value) =>{ //this might be wrong as I'm unsure the data structure of your object
cy.log(value)
}
}
it('Use JSON Data in the HTML form', () =>{
cy.get('@allData')
.then( (dataJson) =>{
allData = JSON.stringify(dataJson)
cy.get('[cy-data="firstname"]')
.type(allData.data.firstName) //and so on from here
}
最后一件事要注意,您在第二个 it 块的末尾有一个 cy.wait(1500)
。我建议查看 cy.intercept().as('api')
以捕获您通过单击提交获得的任何 API 响应。那么它只是一个 cy.wait('api')
的问题,这是一个最佳实践。
只需删除 stringify
步骤。
我认为您打算 parse
,但没有必要,因为 Cypress 已经为您完成了。任何具有 .json
扩展名的文件都作为对象传递到测试中。
cy.fixture("testDataFromCSV.json")
.then((dataJson) => {
// allData = JSON.stringify(dataJson) // no need to do this, just use dataJson
cy.get('[cy-data="firstname"]')
.type(dataJson.firstName) // NOTE you have data.firstName
... // which looks like a cut-and-paste error
// from the test above
写入解析结果的数据部分
papaparse 库为您提供了一个包含数据、错误数组和元数据的包装器对象。
理想情况下,您希望在写入 JSON 之前检查错误,但至少您需要写入解析结果的 .data
属性。
cy.readFile('./cypress/downloads/generatedBy_react-csv.csv').then(str =>{
const result = parse(str, {header:true})
if (result.errors.length) {
// handle errors
}
cy.writeFile('./cypress/fixtures/testDataFromCSV.json', result.data)
})
我正在尝试使用 CSV 文件填写 HTML 表单。对于他们,我首先将 CSV 文件转换为 JSON,然后尝试使用 JSON 文件填写表格。但是,我唯一得到的是错误:cy.type() can only accept a string or number。您传入:undefined
我已经检查了针对同一问题给出的答案,但找不到对我有帮助的答案。我做错了什么?
这里我留下了我首先将文件从 CSV 传递到 JSON 的代码,然后它被记录在控制台中,最后我通过表单传递它:
<!-- language: js -->
import {parse} from "papaparse"
describe('Convert CSV file in JSON file', function(){
let allData
before(()=>{
cy.readFile('C:/data/cypress/downloads/generatedBy_react-csv.csv')
.then(str =>{
cy.writeFile('C:/data/cypress/fixtures/testDataFromCSV.json', parse(str, {header:true}))
})
cy.fixture('testDataFromCSV.json')
.as('dataJson')
.then(dataJson => {
allData = dataJson
})
})
it('Log the data from the CSV to the JSON file', function(){
allData.data.forEach(data =>{
cy.log(data.firstName)
cy.log(data.lastName)
cy.log(data.email)
cy.log(data.age)
cy.log(data.address)
cy.log(data.vehicle)
cy.log(data.phoneNo)
})
})
it('Use JSON Data in hte HTML form', function(){
allData.data.forEach(data =>{
cy.visit('http://localhost/2iTesting/form.html')
cy.fixture("testDataFromCSV.json")
.then((dataJson)=>{
allData = JSON.stringify(dataJson)
cy.get('[cy-data="firstname"]')
.type(data.firstName)
cy.get('[cy-data="lastname"]')
.type(data.lastName)
cy.get('[cy-data="email"]')
.type(data.email);
cy.get('[cy-data="address"]')
.type(data.address);
cy.get('[cy-data="vehicle"]')
.type(data.vehicle);
cy.get('[cy-data="submit"]')
.click()
cy.wait(1500)
})
})
})
})
问题在于您的 then 块的范围。在这个夹具的 then 块内。 cy.fixture('testDataFromCSV.json').as('dataJson').then(dataJson => { allData = dataJson})
allData = dataJson
但在 then 块之外 alldata
= let alldata
或者只是未定义。要访问分配的变量,您需要使用 cy.wrap()
.
cy.fixture('testDataFromCSV.json').as('dataJson')
.then( (dataJson) => {
cy.wrap(dataJson).as(allData)
}
然后要访问您包装的对象,您只需执行以下操作。
it('Log the data from the CSV to the JSON file', () =>{
cy.get('@allData')
.then( (allData) => {
Object.Values(allData.data).forEach( (value) =>{ //this might be wrong as I'm unsure the data structure of your object
cy.log(value)
}
}
it('Use JSON Data in the HTML form', () =>{
cy.get('@allData')
.then( (dataJson) =>{
allData = JSON.stringify(dataJson)
cy.get('[cy-data="firstname"]')
.type(allData.data.firstName) //and so on from here
}
最后一件事要注意,您在第二个 it 块的末尾有一个 cy.wait(1500)
。我建议查看 cy.intercept().as('api')
以捕获您通过单击提交获得的任何 API 响应。那么它只是一个 cy.wait('api')
的问题,这是一个最佳实践。
只需删除 stringify
步骤。
我认为您打算 parse
,但没有必要,因为 Cypress 已经为您完成了。任何具有 .json
扩展名的文件都作为对象传递到测试中。
cy.fixture("testDataFromCSV.json")
.then((dataJson) => {
// allData = JSON.stringify(dataJson) // no need to do this, just use dataJson
cy.get('[cy-data="firstname"]')
.type(dataJson.firstName) // NOTE you have data.firstName
... // which looks like a cut-and-paste error
// from the test above
写入解析结果的数据部分
papaparse 库为您提供了一个包含数据、错误数组和元数据的包装器对象。
理想情况下,您希望在写入 JSON 之前检查错误,但至少您需要写入解析结果的 .data
属性。
cy.readFile('./cypress/downloads/generatedBy_react-csv.csv').then(str =>{
const result = parse(str, {header:true})
if (result.errors.length) {
// handle errors
}
cy.writeFile('./cypress/fixtures/testDataFromCSV.json', result.data)
})