selenium ======== ![](https://www.perfecto.io/sites/default/files/image/2021-10/components.png) [Selenium][1] is an umbrella project for a range of tools and libraries that enable and support the automation of web browsers. Watch [this][2] video to get started. ## Server ```bash $ cat /etc/docker/daemon.json { "default-ulimits": { "nofile": { "Name": "nofile", "Soft": 32768, "Hard": 32768 } }, "live-restore": true } $ systemctl reload docker $ docker-compose up -d $ curl http://127.0.0.1:4444/ ``` > Another way to start selenium server: ```bash $ npm install -g selenium-standalone $ selenium-standalone install $ selenium-standalone start ``` > To kill long-lived sessions: ```bash ENDPOINT=127.0.0.1:4444 MAX_AGE=$((3*60)) # 3 minutes curl -s "http://${ENDPOINT}/status" | jq -r --arg age ${MAX_AGE} '.value.nodes[].slots[]|select(.session and (.session.start|sub("\\..*Z";"Z")|fromdateiso8601 < now-($age|tonumber))).session.sessionId' | xargs -r -t -I {} curl -w '\n' -X DELETE "http://${ENDPOINT}/session/{}" ``` ## Client baidu-search.py ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.proxy import Proxy, ProxyType from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC proxy = Proxy({ 'proxyType': 'MANUAL', 'httpProxy': '1.2.3.4:8080', 'sslProxy': '1.2.3.4:8080', }) options = Options() options.set_capability('proxy', proxy.to_capabilities()) driver = webdriver.Remote( command_executor='http://127.0.0.1:4444/wd/hub', options=options ) driver.get('http://www.baidu.com/') driver.find_element(By.ID, 'kw').send_keys('ip') driver.find_element(By.ID, 'su').click() WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'content_left')) ) driver.save_screenshot('baidu.png') driver.close() ``` search-baidu.js ```javascript var webdriver = require('selenium-webdriver'), By = require('selenium-webdriver').By, until = require('selenium-webdriver').until, fs = require('fs'); webdriver.WebDriver.prototype.saveScreenshot = function(filename) { return driver.takeScreenshot().then(function(data) { fs.writeFile(filename, data.replace(/^data:image\/png;base64,/,''), 'base64', function(err) { if(err) throw err; }); }) }; var driver = new webdriver.Builder() .forBrowser('firefox') .usingServer('http://127.0.0.1:4444/wd/hub') .build(); driver.get('http://www.baidu.com/'); driver.findElement(By.id('kw')).sendKeys('webdriver'); driver.findElement(By.id('su')).click(); driver.wait(until.titleIs('webdriver_百度搜索'), 1000); driver.saveScreenshot('baidu.png'); driver.quit(); ``` ```bash # VNC $ open vnc://127.0.0.1:5900 $ open http://127.0.0.1:7900 # PYTHON $ pip3 install selenium $ python3 baidu-search.py # NODEJS $ npm install -g selenium-webdriver $ node search-baidu.js ``` [1]: http://seleniumhq.org/ [2]: https://www.youtube.com/watch?v=S4OkrnFb-YY