我正在尝试创建一个 yup 模式,其中模式根据变量值略有变化。就我而言,根据 prop 的值,myCondition我需要根据需要创建一个字段。我想知道是否有更好的方法可以使用 Yup 实现相同的目的。这是我当前有效的代码结构:
// config.js
const COMMON_SCHEMA = {
str1: yup
.string()
.nullable()
.required('Please input str1'),
str3: yup
.string()
.nullable()
};
const VALIDATION_SCHEMA_1 = yup.object().shape({
...COMMON_SCHEMA,
str2: yup.string().nullable(),
});
const VALIDATION_SCHEMA_2 = yup.object().shape({
...COMMON_SCHEMA,
str2: yup
.string()
.nullable()
.required('Please input str2'),
});
const SCHEMAS = {
VALIDATION_SCHEMA_1,
VALIDATION_SCHEMA_2
}
export default SCHEMAS;
Run Code Online (Sandbox Code Playgroud)
以下是我有条件地选择不同模式的方法:
// app.js
import SCHEMAS from './config';
...
<Formik
validationSchema={
this.props.myCondition === true
? SCHEMAS.VALIDATION_SCHEMA_1
: SCHEMAS.VALIDATION_SCHEMA_2
}
>
...
</Formik>
Run Code Online (Sandbox Code Playgroud)
我觉得我可以用更简单的方式实现上面所做的任何事情 …
我想在puppeteer中禁用缓存,有人可以告诉我该怎么做吗?我找到了,page.setCacheEnabled(enabled)但是我不明白如何使用它。
我知道浏览器是在没有缓存或Cookie的情况下启动的,但就我而言,浏览器始终在后台运行,因此需要其他解决方案。
我正在尝试使用 puppeteer 浏览 SPA,我在这里面临的问题是我无法等待页面加载然后继续我的程序。
我填写了一个表格,然后点击提交,根据表格的内容,可以加载不同的页面,所以我不能使用,page.waitFor(Selector)因为根据输入可以有很多不同的页面。
我尝试使用waitUntil:load、networkidle2、networkidle0、domcontentloaded,但它们都在元素加载之前触发。
我试图自动化的页面是Link。(如果你想自己检查,然后选择预订参考并填写随机详细信息,然后按继续。)
在链接中选择“预订参考”后,我用 puppeteer 填写详细信息,然后按继续按钮,我无法弄清楚如何在不依赖选择器的情况下等待页面完全加载。
我有一个函数matchTagAndText,正如名称所说,接受2个参数的选择器和文本,并检查是否有任何匹配的元素具有给定的文本.它是这样的:
function matchTagAndText(sel, txt) {
var elements = document.querySelectorAll(sel);
return Array.prototype.filter.call(elements, function(element){
return RegExp(txt,'i').test(element.textContent);
});
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试选择一个td包含文本'Lorem ipsum' 的元素,但我无法这样做.
我的HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Frames</title>
</head>
<body>
<td colspan="2" class="font-description">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Tempora nulla iste, quae necessitatibus. Impedit mollitia delectus eum voluptas ullam! Perspiciatis in dolorem blanditiis dolores mollitia sint nostrum sunt veniam est!
</td>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我在控制台中定义它后尝试调用该函数:
var el = matchTagAndText('td.font-description','Lorem ipsum');
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个空数组.我的功能出了什么问题?
实例:
function matchTagAndText(sel, txt) { …Run Code Online (Sandbox Code Playgroud)我正在使用Puppeteer在网站上运行测试.单击按钮后,将出现一个带有报告的新弹出浏览器窗口.在那个新窗口中是我想要提取的信息.如何让木偶操作者将焦点转移到这个新创建的浏览器窗口?
我的木偶操作页面上有多个打印按钮,点击它会创建弹出窗口,我正在尝试获取这些页面的pdf.这是我正在使用的代码.
let printButtons = await this.page.$$('#printNowButton');
for (var i = 0; i < printButtons.length; i++) {
printButtons[i].click();
const fileName = ('Document'+ i + '.pdf');
browser.on('targetcreated', async target => {
if ((target.url() !== 'about:blank')) {
try {
const pageList = await browser.pages();
const newPage = await pageList[pageList.length - 1];
await newPage.pdf({
path: fileName,
format: 'A4'
}).then(() => {
newPage.close();
});
} catch (e) {
console.log('Error: ' + e);
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我正在使用puppeteer版本0.13.0任何其他方式来获得我想要实现的目标也值得赞赏.
我正在读这本名为YDKJS的书,它提到:
typeof null是一个有趣的案例,因为"object"当你期望它返回时,它会错误地返回"null".警告:这是JS中一个长期存在的错误,但可能永远不会修复.Web上的代码过多依赖于bug,因此修复它会导致更多错误!
我无法绕过任何使用a的返回类型的代码null.任何人都可以举一些例子用例吗?
我想使用 document.querySelector() 中的选择器来选择所有带有文本“print”的标签。
<a href="https://www.google.co.in">print</a>
Run Code Online (Sandbox Code Playgroud)
我怎样才能选择相同的。我不想使用 jQuery。我不必只是 querySelector 但任何其他选择器都可以。
我在一个页面中有多个链接,我想按顺序或一次性访问.我想要做的是打开各自新标签中的所有链接,并将页面作为所有页面的pdf.我如何与木偶戏实现同样的目标?
我可以获得DOM和href属性的所有链接,但我不知道如何在新选项卡中打开它们访问它们然后关闭它们.
我创建了一个表单,您可以使用javascript和jQuery添加或删除表行.我想知道如何获取和设置每个表行的索引,以便即使我要从表的中间删除和元素,也保持序列.该表的形式如下:
<thead>
<tr>
<th>Index</th>
<th>Name</th>
<th>Property</th>
<th>Edit/Delete</th>
</tr>
</thead>
<tbody>
<tr>
<td class="index">Index goes here (1)</td>
<td>NameOne</td>
<td>PropOne</td>
<td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
</tr>
<tr>
<td class="index">2</td>
<td>NameTwo</td>
<td>PropTwo</td>
<td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
</tr>
<tr>
<td class="index">3</td>
<td>NameThree</td>
<td>PropThree</td>
<td><span class="edit">Edit Icon</span> <span class="delete">Delete Icon</span></td>
</tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)
现在我想要实现的是,如果我要删除第二行,前一行的索引应该自动更改为2,如果我要添加新元素,它应该自动取索引值3,依此类推.
我尝试用以下方法实现这一点:
function setIndex(){
$("td.index").each(function(index) {
$(this).text(++index);
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我使用上面的函数时虽然初始索引正确地添加了元素,但是当我在删除或编辑一行后再次调用该函数时,索引将无法正确更新(我使用jQuery remove删除了行).
我也用jQuery append()创建新的表行.
我认为虽然我使用了remove(),但是当我在setIndex()中使用console.log("test")语句时,它们并没有被完全删除,尽管"test"只应打印两次(我最初创建了3行并删除其中一行)它打印三次,表示有3个tr.index.
请帮我解决一下.
我试图获得所有div元素与名称包含print的类.我试图这样做:
const matchedContainer = [];
$('div').filter(() => {
regex = new RegExp("\w*print\w*","i");
if( this.class !== undefined && this.class.match(regex)) {
var elementContents = $(this).prop('outerHTML');
matchedContainer.push(elementContents);
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我永远无法进入if循环,因为this.class始终等同于undefined.我也用".each"而不是".filter"尝试了相同的结果.我也尝试通过".filter((ind,elem)=> {...})"给每个元素命名,然后尝试使用elem.class,但这样做也不行.
我用this.id尝试了类似的方法,并且工作正常,任何人都可以告诉我我做错了什么?