Fork me on GitHub

Selenium

Полезные ссылки

Запуск chrome без графического окна

from selenium import webdriver
options = webdriver.ChromeOptions()
# tell selenium to use the dev channel version of chrome
# NOTE: only do this if you have a good reason to
options.binary_location = '/usr/bin/google-chrome-unstable'
options.add_argument('headless')
# set the window size
options.add_argument('window-size=1200x600')
# initialize the driver
driver = webdriver.Chrome(chrome_options=options)
driver.get('https://facebook.com')
# wait up to 10 seconds for the elements to become available
driver.implicitly_wait(10)
# wait up to 10 seconds for the elements to become available
driver.implicitly_wait(10)

Настройка прокси сервера в браузерах

profile = webdriver.FirefoxProfile()
profile.set_preference("network.proxy.type", 1)
profile.set_preference("network.proxy.http", "10.10.10.10")
profile.set_preference("network.proxy.http_port", 8080)
profile.update_preferences()
driver = webdriver.Firefox(firefox_profile=profile)
  • Chrome
from selenium import webdriver
PROXY = "23.23.23.23:3128" # IP:PORT or HOST:PORT
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://%s' % PROXY)
chrome = webdriver.Chrome(chrome_options=chrome_options)

Переключение между окнами и фреймами

источник: https://habrahabr.ru/post/250947/

WebDriver поддерживает переключение между именованными окнами с помощью метода “switch_to_window”:

driver.switch_to_window("windowName")

Вы можете использовать цикл для перебора всех открытых окон, к примеру, так:

for handle in driver.window_handles:
driver.switch_to_window(handle)

Еще вы можете переходить между фрэймами (frame или iframes):

driver.switch_to_frame("frameName")

Можно получить доступ к подчиненным фреймам, подавая путь, разделяемый точкой, или можно получить фрейм по индексу:

driver.switch_to_frame("frameName.0.child")

Следующий код перенаправит к фрейму с именем “child”, который в свою очередь принадлежит первому подчиненному фрейму фрейма “frameName”. Пути к фреймам описываются полностью — от верхнего уровня:

driver.switch_to_frame("frameName.0.child")

Когда работа с фреймами будет завершена, необходимо переключиться обратно, к главному фрейму, что может быть сделано следующим образом:

driver.switch_to_default_content()

Всплывающие окнаSelenium WebDriver из упаковки поддерживает управление всплывающими диалоговыми окнами. После того как вы инициируете запуск, откроется окно, управлять им можно так:

alert = driver.switch_to_alert()

Код вернет объект текущего открытого окна. С этим объектом вы можете принять, отклонить вопрос окна, прочитать его содержимое или даже ввести текст по приглашению окна. Интерфейс взаимодействия со всплывающими окнами работает одинаково хорошо как для предупреждений (alerts), так и для запросов к подтверждению (confirms) и приглашений к вводу (prompts). За дополнительной информацией обратитесь к документации API.```

источник: https://stackoverflow.com/questions/48245424/how-to-use-screenshot-in-headless-firefox-in-selenium-with-python

The Release Notes of Selenium v3.6.0 clearly mentions Add options to start Firefox and Chrome in headless modes. So we need to use the Options Class as follows to invoke the headless argument:

from selenium import webdriver  
from selenium.webdriver.firefox.options 
import Options 
options = Options() 
options.add_argument("--headless") 
driver = webdriver.Firefox(firefox_options=options, executable_path="C:\\Utility\\BrowserDrivers\\geckodriver.exe")  
print("Firefox Headless Browser Invoked") 
driver.get('http://google.com/') 
driver.quit()

Следующий фрагмент кода Java WebDriver должен работать для запуска IE. Код будет игнорировать настройку параметров защищенного режима для всех зон в браузере IE.

DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
File file = new File("D:\\Ripon Al Wasim\\IEDriverServer.exe");
System.setProperty("webdriver.ie.driver", file.getAbsolutePath());
WebDriver driver = new InternetExplorerDriver(capabilities);
driver.get("https://www.google.com/");

Загрузите IEDriverServer и извлеките его в нужное место и установите абсолютный путь (в моем примере выше это было "D:\Ripon Al Wasim\IEDriverServer.exe" )

Всяко-разное (отсортировать)

Вот еще одно решение, использующее remotewebdriver, оно работает как магия, и мне это нравится. Вот класс, который у меня есть:

driver.findElementByLinkText("Upload Files").click();
driver.setLogLevel(Level.ALL);
System.out.println(driver.getCurrentUrl());
WebElement element = driver.findElement(By.xpath("//input[@name='file_1']"));
LocalFileDetector detector = new LocalFileDetector();

//Now, give the file path and see the magic :)              
String path = "D://test66T.txt";
File f = detector.getLocalFile(path);
((RemoteWebElement)element).setFileDetector(detector);
element.sendKeys(f.getAbsolutePath());

//now click the button to finish
driver.findElementByXPath("//html/body/div[9]/div[1]/a/span").click(); 
  • Проблема — необходимо загрузить файл на сервер, используя стандартные элементы HTML:
<input name=«uploadFile»type=«file»>
<input name=«doUpload»value=«Upload»type=«button»/>

Решение — я рекомендую просто взять и вынести себе это в отдельный универсальный метод и использовать его каждый раз когда нужно что-либо загрузить через такую форму.

Исключение — Safari Driver полностью не поддерживает загрузку файла, т.к. насколько я понял, он javascript-based. Появляющееся окно с выбором файла ставит его в тупиковое положение. Такие сценарии нужно либо избегать, либо добиваться результата другим способом — создавать собственный HTTP запрос или подкладывать данные напрямую на стороне сервера, если такая возможность имеется.

Пример кода:

protected void uploadFile(By uploadInput, By uploadButton, String filePath) {
       clearInput(uploadInput);
       findElement(uploadInput).sendKeys(filePath);
       findElement(uploadButton).click(); 

social