所以我在 WebdriverIO(Visual Studio Code、node.js、javascript 等)中遇到了令人沮丧的错误。我有一个脚本,该脚本从一个网站开始,通过一系列 IF/THEN,单击按钮将其引导至新网站。这很好用。但是当我在新网站上时,我的代码都不起作用,因为我的选择器都找不到这些元素。
但更关键的是:当我创建另一个直接进入此页面的脚本时,完全相同的代码可以工作。所有元素都可以被找到、交互、获取文本/点击一切。
为什么完全相同的代码仅在直接打开页面时才起作用,而不是在通过单击先前页面的按钮打开页面时起作用。
console.log('INTERMEDIARY PAGE')
browser.pause(2000)
let Title = $("(//h1[contains(@class,'cs-entry__title')])")
console.log(Title)
let ProductButton = $("(//*[contains(@class,'button')])[1]")
ProductButton.click()
“错误:无法使用选择器“(//*[contains(@class,'button')])[1]”调用元素上的单击,因为找不到元素”
更新: 在新页面上,我执行了 console.log(browser.getUrl()),它显示了 URL 1 的 URL。我在 URL 2 上!我眼前看到的并不是爬虫看到的。这是机器人保护的一种形式吗?
好吧,我仍然不知道是什么原因造成的,但我确实找到了解决方法。不要单击链接(DIV 标签),而是对其执行 getAttribute('href') 操作。然后自己打开。
<a href="LINK" rel="noopener noreferrer" target="_blank" role="link" class="css-4rbku5 css-18t94o4 css-1dbjc4n r-1loqt21 r-18u37iz r-16y2uox r-1wtj0ep r-1ny4l3l r-o7ynqc r-6416eg">
let button = $("(//a[contains(@class,'css-4rbku5 css-18t94o4 css-1dbjc4n r-1loqt21 r-18u37iz r-16y2uox r-1wtj0ep r-1ny4l3l r-o7ynqc r-6416eg')])[2]")
let attribute = button.getAttribute('href')
console.log(attribute) --> prints out LINK
browser.url(attribute)
由于某种原因,虽然我遇到了类似的问题(浏览器加载新页面后无法找到 DOM 元素),但调用
await browser.getURL()
会正确返回新网站的 URL,因此我能够解决该问题通过执行以下操作:
const url = await browser.getUrl();
await browser.url(url);
我们必须诉诸这样的黑客来简单地单击链接,这似乎非常荒谬,但我想这就是 WebDriverIO 野兽的本质......