В настоящее время я становлюсь все более и более разочарованным, и я надеюсь найти некоторую помощь по stackexchange.
Перво-наперво: я не опытный разработчик Javascript, возможно, вообще не опытный разработчик, ноНаверное, я знаю, как работать с базовыми сценариями - я немного знаю C #, Java и co. Для моего текущего сценария веб-автоматизации я подумал, что было бы неплохо догнать и попробовать написать на Javascript, но сейчасЯ нахожусь в точке, где я считаю, что начинать с нуля с другого, не столь запутанного языка.
Пожалуйста, кто-нибудь может сказать мне, как, черт возьми, я могу позволить моему коду выполняться синхронно сверху вниз?
После долгих часов поисков в Google, я попробовалдо сих пор:
- начинайте строку 1 с
#! /usr/bin/env node
и начинайте в терминале, используя ./app.js
- , делайте каждую функцию () функцией
async
() - использовать
await
во всех методах ()
Но даже сейчас, когда я запускаю скрипт, он бросает мне много UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'isDisplayed' of undefined
и подобных вещей, что позволяет мне догадаться, что этот узелвыполняет некоторые из моих методов / функций асинхронно.Эти исключения появляются в консоли задолго до того, как окна браузера открываются и загружаются.
Я использую: * selenium-webdriver 3.6.0 * Firefox 60.0.2 * узел 8.10.0
Мой код выглядит примерно так:
const {Builder, By, Key, until, manage} = require('selenium-webdriver');
const firefox = require('selenium-webdriver/firefox');
const webdriver = require('selenium-webdriver');
const fs = require('fs');
//
// declaring lots of global variables, I need in my functions
//
async function init(){
let options = await new firefox.Options()
.setProfile('/home/ruphus/.mozilla/firefox/selenium_profile.backtesting');
let driver = await new webdriver.Builder()
.forBrowser('firefox')
.setFirefoxOptions(options)
.build();
await driver.get('https://www.someurl.com/')
.then(openStrategySettings())
.then(btnStrategySettings.click());
// ... defining webelements/locations to the previously created objects - using xpath
inputPeriod = await driver.findElement(By.xpath("//div[@id='header-toolbar-intervals']/div/div/div"));
}
async function openStrategySettings() {
if (!someWebelement.isDisplayed()){
await tabStrategyTester.click();
}
}
async function inputValue(element, value) {
await element.sendKeys(Key.BACK_SPACE + Key.BACK_SPACE + value.toString());
}
async function run(){
// this is the main function with a couple of for loops and array.forEach(function()... things
}
init();
run();
Итак, насколько я понимаю, я запускаю webdriver и firefox с моей функцией async init()
.Здесь я использую await для всех этих методов.После запуска webdriver / firefox я определяю переменные Object для местоположений (я хочу, чтобы это происходило, когда браузер запущен и загружен).
Но почему-то я не понимаю, почему, кажется, скрипт запускает всемои функции и весь код, который он может найти сразу после запуска скрипта.На самом деле кажется, что он ждет загрузки браузера последним.Перед окончательной загрузкой я получаю несколько (8) UnhandledPromiseRejectionWarning
..
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'sendKeys' of undefined
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'click' of undefined
UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'isDisplayed' of undefined
Я был бы очень признателен за помощь здесь.