如何找到选择器,for .click in Nightmare.js?

How do I find the selector, for .click in Nightmare.js?

我正在尝试使用 Nightmare.js 自动抓取网页。我是一名系统管理员,我对 Node.js 或 CSS 不是很了解。

我已经能够让 Nightmare 输入并单击几个按钮让我登录 - 我通过使用 Chrome 开发工具 Inspect 找到了选择器。不幸的是,Nightmare 需要的,或者我认为它需要的,不是可粘贴的?例如,我正在使用的登录用户名框,这是在 Nightmare 中起作用的:

.insert('input#username.form-control', 'username')

在 Chrome Dev Tools 中,在 Elements 中,这是悬停在 GUI 元素上的内容,并且是 "Properties" 中的第一行,但是如果我 "Copy selector",我会得到

#username

复制 Xpath:

//*[@id="username"]

复制元素:

<input class="form-control" type="text" cols="60" placeholder="Email (or username)" required="" name="username" id="username" value="" autocorrect="off" autocapitalize="off" autocomplete="off" background-repeat: no-repeat; background-attachment: scroll; background-size: 16px 18px; background-position: 98% 50%; cursor: auto;">

我如何将其中任何一个翻译成 Nightmare.js 可以使用的内容?我有点出海了。

就像我说的,我通过手动复制 "Properties" 中的第一个东西来让那个工作,但为什么我不能从 Chrome Dev Tools 中复制那个东西?显然,Chrome 和 Nightmare 对什么是选择器有不同的看法,我什至不知道如何开始调和它们。当我尝试搜索 CSS Selector 和 Node.js 时,我发现建议使用 Github 中的更多内容,例如 Cheerio.js(我还没有这样做),而不是透露任何信息关于我实际上做错了什么。

无法正常工作的具体示例:我有一个无法点击的按钮。 复制元素:

<button tabindex="0" role="button" aria-disabled="false" class="dpl-button___jGBcY button-tertiary-colors button-font-size button-font-weight button-line-height button-text-transform font-family-primary button-pad button-shadow border-radius-button">Policy Tester</button>

我正在根据我在这里和 Google 上的发现尝试不同的方法,但没有取得进展。我显然遗漏了一些东西。

尝试 .click('button#Policy Tester') 是行不通的,显然是因为其中有一个 space。

尝试 .click('button[tabindex="0"]') 得到 "unable to find element by selector"。

尝试.click('button.dpl-button___jGBcY.button-tertiary-colors.button-font-size.button-font-weight.button-line-height.button-text-transform.font-family-primary.button-pad.button-shadow.border-radius-button')也是找不到元素。

谢谢你的背景,但我相信你的问题可以浓缩为询问什么 jQuery 选择器可以用来访问 <button tabindex="0" role="button" aria-disabled="false" class="dpl-button___jGBcY button-tertiary-colors button-font-size button-font-weight button-line-height button-text-transform font-family-primary button-pad button-shadow border-radius-button">Policy Tester</button>.

这将访问元素 $('button[class^="dpl-button_"]')。这里的缺点是此 class 没有任何独特之处,这意味着所有*具有此 class 的元素都将应用您的点击事件。

请注意,此元素包含多个属性,这意味着此处有多个选项。但是,请注意,根据您定位的属性,DOM 中的其他元素很可能具有相同的属性,因此这里的关键是找到独特的东西。大多数时候,我们可以将 ID 应用于元素,只要 ID 在 DOM 中是唯一的,您就可以简单地使用 $('#YourUniqueId') 来访问该特定元素,而不能访问其他元素。

关于您在 post 中输入的不正确内容,需要注意的一件事是您试图通过使用元素文本作为 ID(例如,.click('button#Policy Tester'))来访问该元素。元素文本不是它的 ID。

这里有几个链接可能会帮助那些需要可靠参考的选择器:

修订更新

研究了Nightmare.js一点,请尝试click('button.dpl-button___jGBcY')找到元素。

有很多方法可以获得合适的选择器。使用检查元素等。

方式一

"copy selector" 来自 "inspect element",大部分时间都可以。你不复制元素,你复制 selector

方式 2

这是 chrome 中的一种简单方法。

  • 安装SelectorGadget
  • 然后在您要抓取的任何页面上,打开 selectorgadget 并选择元素。
  • 你已经得到了你需要的元素选择器。
  • 使用它。