[[oktatas:web:selenium|< Selenium]] ====== Selenium - JavaScript ====== * **Szerző:** Sallai András * Copyright (c) 2021, Sallai András * Szerkesztve: 2021, 2022, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== A Selenium ===== A Selenium egy automatikus webalkalmazás tesztelő. * https://www.selenium.dev/ {{:oktatas:web:selenium:selenium_osszetevok.png|}} WebDriver programozható a következő nyelveken: * JavaScript * Python * Java * Ruby * C# Ha WebDrivert használunk nincs szükség köztes szerverre, közvetlenül kommunikál a böngészővel. ===== JavaScript webdriver ===== Webdriver esetén valamilyen nyelven tesztet írunk. Itt most JavaScript nyelven fogunk tesztet írni. ==== Szükséges szoftverek ===== * Node.js - https://nodejs.org/ * Visual Studio Code - https://code.visualstudio.com/ ===== A chromedriver ===== A chromedirver egy önálló szerver program. Minden Google Chrome verzióhoz kell egy ugyanolyan verziójú chromedriver. A ChromeDriver 100, csak a 100 verziójú Google Chrome-mal használható. Ha Node.js-t használunk (mint ebben a leírásban) a letöltést a npm tárolóból is megoldható, és nem szükséges külön szervert futtatni. Letöltőhely: * https://chromedriver.chromium.org/downloads (2023) Ha Node.js-t használunk a ChromDriver betölthető Node.js csomagból is. Önálló indítás: chromedriver Starting ChromeDriver 100.0.4896.60 (6a5d10861ce8de5fce22564658033b43cb7de047-refs/branch-heads/4896@{#875}) on port 9515 Only local connections are allowed. Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe. ChromeDriver was started successfully. Önálló indításhoz a chromedriver parancsot az útvonalba szokták tenni, ekkor a Selenium automatikusan használja. Más böngészőkhöz: ^ Driver ^ Böngésző ^ | ChromeDriver | Google Chrome | | GeckoDriver | Firefox | | EdgeDriver | Microsoft Edge | | InternetExplorerDriver | IE | Ezekből nem mindegyik létezik Node.js-hez. ===== Teszt létrehozása ===== Hozzuk létre az első tesztünket. mkdir app01 cd app01 code . VSCode terminálban: npm init -y Telepítsük a selenium-webdriver és chromedriver csomagokat. npm i selenium-webdriver --save-dev npm i chromedriver --save-dev De ha az aktuális Chrome verzió 112, akkor: npm i --save-dev chromedriver@112 Chrome-t használunk a példában. A Firefoxhoz a geckodriver csomag szükséges. //A Builder, By és Key objektumokra van szükségünk: const {Builder, By, Key} = require("selenium-webdriver"); //Ezt a szervert csak betöltjük: require('chromedriver'); async function szitTest() { let driver = await new Builder().forBrowser("chrome").build(); await driver.get("https://szit.hu"); await driver.findElement( By.name("q")) .sendKeys("selenium", Key.RETURN); } szitTest(); Futtassuk a tesztet: node index A teszt keres egy olyan input elemet, amelynek a name értéke "q". Ebbe beírja, hogy selenium, majd elküldi a kérést. ===== Azonosítás ===== Document

Példa



Jelszó: " . $_POST['pass']; } ?>
Futtassuk: php -S localhost:8000 -t . ==== Teszt ==== const {Builder, By} = require("selenium-webdriver"); require('chromedriver'); async function loginTest() { let driver = await new Builder().forBrowser("chrome").build(); await driver.get("http://localhost:8000"); await driver.findElement( By.name("user")).sendKeys('janos'); await driver.findElement( By.name("pass")).sendKeys('titok'); await driver.findElement( By.id("loginButton")).click(); } loginTest(); ==== Futtatás ==== node index ===== Triangle tesztelése ===== GitHubon: * https://github.com/oktat/extriangle_selenium.git ==== Node.js projekt ==== { "name": "app33", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "node test/index.js", "start": "lite-server" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "chromedriver": "^111.0.0", "lite-server": "^2.6.1", "selenium-webdriver": "^4.8.1" } } { "server": [ "src" ] } ==== Az alkalmazás ==== A Triangle területszámító program háromszög számára. Bemenő paraméterek az alap és a magasság. Triangle

Triangle

doc = { baseInput: document.querySelector('#base'), heightInput: document.querySelector('#height'), areaInput: document.querySelector('#area'), calcButton: document.querySelector('#calcButton') }; window.addEventListener('load', () => { init(); }); function init() { doc.calcButton.addEventListener('click', () => { let base = Number(doc.baseInput.value); let height = Number(doc.heightInput.value); doc.areaInput.value = calcTriangleArea(base, height); }); } function calcTriangleArea(base, height) { return base * height / 2; } ==== A teszt ==== const { Builder, By, Key, until } = require("selenium-webdriver"); require('chromedriver'); async function triangleTest() { let driver = await new Builder().forBrowser("chrome").build(); await driver.get('http://localhost:3002'); await driver.findElement(By.id('base')).sendKeys('30'); await driver.findElement(By.id('height')).sendKeys('35'); await driver.findElement(By.id('calcButton')).click(); const areaInput = await driver.findElement(By.id('area')).getAttribute('value'); console.log(areaInput) await driver.close(); } triangleTest(); ===== Input elem tartalma ===== const { Builder, By, Key, until } = require("selenium-webdriver"); require('chromedriver'); async function triangleTest() { let driver = new Builder().forBrowser("chrome").build(); driver.get('http://localhost:3002'); driver.findElement(By.id('base')).sendKeys('30'); driver.findElement(By.id('height')).sendKeys('35'); driver.findElement(By.id('calcButton')).click(); const areaInput = await driver.findElement(By.id('area')).getAttribute('value'); console.log(areaInput) driver.close(); } triangleTest(); const { Builder, By, Key, until } = require("selenium-webdriver"); require('chromedriver'); function triangleTest() { let driver = new Builder().forBrowser("chrome").build(); driver.get('http://localhost:3002'); driver.findElement(By.id('base')).sendKeys('30'); driver.findElement(By.id('height')).sendKeys('35'); driver.findElement(By.id('calcButton')).click(); const areaPromise = driver.findElement(By.id('area')).getAttribute('value'); areaPromise.then(res => console.log(res)); driver.close(); } triangleTest(); A getAttribute() egy Promise-t ad vissza, így vagy futtatjuk rajta a then() függvényt, vagy használjuk a async-await párost. ===== Az xpath használata ===== const { Builder, By} = require('selenium-webdriver') const url = 'http://localhost:3000' function test01() { let driver = new Builder().forBrowser('chrome').build() driver.get(url) let baseInput = driver.findElement(By.xpath('//input[@id="base"]')) baseInput.sendKeys('30') let heightInput = driver.findElement(By.xpath('//input[@id="height"]')) heightInput.sendKeys(('35')) let calcButton = driver.findElement(By.xpath('//button[@id="calcButton"]')) calcButton.click() let areaInput = driver.findElement(By.xpath('//input[@id="area"]')) let areaPromise = areaInput.getAttribute('value') areaPromise.then(res => console.log(res)) } test01() A // után jön a keresett HTML elem neve. A @ után jön az attribútum, majd az egyenlőség jel után a érték. ===== Jelölőnégyzet ===== const { Builder, By } = require('selenium-webdriver') const url = 'http://localhost:3000' async function test01() { let driver = new Builder().forBrowser('chrome').build() driver.get(url) let res = await driver.findElement(By.id('jarmu')).isSelected() console.log(res) } test01() Az eredmény false Ha be van állítva: Az eredmény true ===== Gyakorló ===== * https://szit.hu/d/dreg/ ===== Linkek ===== * https://www.javatpoint.com/selenium-tutorial (2023)