我将如何在 selenium webdriver 中自动执行此操作?
How would I automate this in selenium webdriver?
我是 Selenium Webdriver (Js) 的新手,正在尝试学习一些基础知识,主要停留在这个例子上:
我正在尝试自动谷歌搜索“暗黑破坏神 2 复活前发布的天数”,然后将剩余天数从 google 打印到控制台。
我遇到的困难是将剩余天数打印到我的控制台。我觉得问题是,当 webdriver 试图找到它时,我尝试使用 .getText() 的元素尚不可用,但是使用 driver.sleep() 或 implicitlyWait 对我不起作用由于某些原因。我使用 xpath 和 css 作为选择器,它们都不适合我。这是我的代码:
const {Builder, By, Key, until, WebDriver} = require("selenium-webdriver");
const { elementIsVisible } = require("selenium-webdriver/lib/until");
require("chromedriver");
let driver = new Builder().forBrowser("chrome").build();
driver.get("https://google.com");
// this clicks on cookies accept button
driver.findElement(By.css("#L2AGLb > div")).click();
driver.findElement(By.css('body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input')).sendKeys('Diablo 2 Resurrected days until release');
driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]')).click();
driver.findElement(By.xpath('/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div[2]/div/div[1]')).getText().then(txt => {
console.log("Do D2R releasu zbývá: " + txt)
}).catch(err => {
console.log('error!', err);
});
这里是错误:
error! NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div[2]/div/div[1]"}
编辑:已解决!这是工作代码
const {Builder, By, Key, until, WebDriver} = require("selenium-webdriver");
require("chromedriver");
let driver = new Builder().forBrowser("chrome").build();
async function howManyDaysTillDiablo2ResurrectedRelease() {
await driver.get("https://google.com");
await driver.findElement(By.css("#L2AGLb > div")).click();
await driver.findElement(By.css('body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input')).sendKeys('Diablo 2 Resurrected days until release');
await driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]')).click();
let ele = await driver.wait(until.elementLocated(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")), 10000);
let foo = await ele.getText();
await driver.findElement(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")).getText().then(foo => {
console.log("Do D2R releasu zbývá: " + foo)
}).catch(err => {
console.log('error!', err);
})};
howManyDaysTillDiablo2ResurrectedRelease();
您正在使用的 xpath
看起来像是从开发工具中获得的。 (而且是绝对 xpath,不是相对 xpath)
正如您提到的您是初学者,我建议您学习 css 选择器和 xpath 并尝试编写自己的。同时 :-
您可以使用下面的 css :
div[data-attrid*='calculate:how_many_days_away'][role='heading'] div
并像这样使用它:
driver.findElement(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div
")).getText()
更新:
let ele = await driver.wait(until.elementLocated(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")), 10000);
let foo = await ele.getText();
我是 Selenium Webdriver (Js) 的新手,正在尝试学习一些基础知识,主要停留在这个例子上:
我正在尝试自动谷歌搜索“暗黑破坏神 2 复活前发布的天数”,然后将剩余天数从 google 打印到控制台。
我遇到的困难是将剩余天数打印到我的控制台。我觉得问题是,当 webdriver 试图找到它时,我尝试使用 .getText() 的元素尚不可用,但是使用 driver.sleep() 或 implicitlyWait 对我不起作用由于某些原因。我使用 xpath 和 css 作为选择器,它们都不适合我。这是我的代码:
const {Builder, By, Key, until, WebDriver} = require("selenium-webdriver");
const { elementIsVisible } = require("selenium-webdriver/lib/until");
require("chromedriver");
let driver = new Builder().forBrowser("chrome").build();
driver.get("https://google.com");
// this clicks on cookies accept button
driver.findElement(By.css("#L2AGLb > div")).click();
driver.findElement(By.css('body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input')).sendKeys('Diablo 2 Resurrected days until release');
driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]')).click();
driver.findElement(By.xpath('/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div[2]/div/div[1]')).getText().then(txt => {
console.log("Do D2R releasu zbývá: " + txt)
}).catch(err => {
console.log('error!', err);
});
这里是错误:
error! NoSuchElementError: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[7]/div/div[9]/div[1]/div/div[2]/div[2]/div/div/div[1]/div/div[1]/div[1]/div[1]/div/div[2]/div/div[1]"}
编辑:已解决!这是工作代码
const {Builder, By, Key, until, WebDriver} = require("selenium-webdriver");
require("chromedriver");
let driver = new Builder().forBrowser("chrome").build();
async function howManyDaysTillDiablo2ResurrectedRelease() {
await driver.get("https://google.com");
await driver.findElement(By.css("#L2AGLb > div")).click();
await driver.findElement(By.css('body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input')).sendKeys('Diablo 2 Resurrected days until release');
await driver.findElement(By.xpath('/html/body/div[1]/div[3]/form/div[1]/div[1]/div[3]/center/input[1]')).click();
let ele = await driver.wait(until.elementLocated(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")), 10000);
let foo = await ele.getText();
await driver.findElement(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")).getText().then(foo => {
console.log("Do D2R releasu zbývá: " + foo)
}).catch(err => {
console.log('error!', err);
})};
howManyDaysTillDiablo2ResurrectedRelease();
您正在使用的 xpath
看起来像是从开发工具中获得的。 (而且是绝对 xpath,不是相对 xpath)
正如您提到的您是初学者,我建议您学习 css 选择器和 xpath 并尝试编写自己的。同时 :-
您可以使用下面的 css :
div[data-attrid*='calculate:how_many_days_away'][role='heading'] div
并像这样使用它:
driver.findElement(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div
")).getText()
更新:
let ele = await driver.wait(until.elementLocated(By.css("div[data-attrid*='calculate:how_many_days_away'][role='heading'] div")), 10000);
let foo = await ele.getText();