Страницы

Поиск по вопросам

Показаны сообщения с ярлыком selenium. Показать все сообщения
Показаны сообщения с ярлыком selenium. Показать все сообщения

вторник, 31 марта 2020 г.

python Скриншот веб страницы без запуска диалоговых окон браузера

#python #selenium


К примеру selenium'ом это решается красиво и лаконично, но при этом открывается окно
браузера. Можно ли как-нибудь делать скриншоты без этого? Возможно, используя другой
подход (не через selenium)

from selenium import webdriver

DRIVER = "chromedriver.exe"
driver = webdriver.Chrome(DRIVER)
driver.get("https://ru.stackoverflow.com/")
screenshot = driver.save_screenshot("my_screenshot.png")
driver.quit()

    


Ответы

Ответ 1



Нашел способ. Просто нужно было использовать PhantomJS, с ним окно браузера не открывается . from selenium import webdriver DRIVER = '\phantomjs-2.1.1-windows\\bin\phantomjs.exe' driver = webdriver.PhantomJS(DRIVER) driver.get("https://ru.stackoverflow.com/") screenshot = driver.save_screenshot("my_screenshot.png") driver.quit()

Ответ 2



Самый простой способ снимок экрана c веб-страницей получить — это запустить браузер с подходящими опциями: #!/usr/bin/env python3 from subprocess import check_call url = 'https://ru.stackoverflow.com' width, height = 1920, 1080 filename = "my_screenshot.png" chrome_executable = 'chromium-browser' check_call([chrome_executable, '--headless', f'--screenshot={filename}', f'--window-size={width},{height}', '--hide-scrollbars', url]) Аналог для selenium выглядит как: #!/usr/bin/env python3 from selenium import webdriver # $ pip install selenium options = webdriver.ChromeOptions() options.add_argument('headless') options.add_argument(f'window-size={width},{height}') options.add_argument('hide-scrollbars') # get chromedriver from # https://sites.google.com/a/chromium.org/chromedriver/downloads browser = webdriver.Chrome(chrome_options=options) browser.get(url) browser.save_screenshot(filename) Можно напрямую API использовать без selenium, к примеру, у firefox есть marionette: #!/usr/bin/env python2 import os # $ pip install marionette_driver from marionette_driver.marionette import Marionette firefox_binary = '/usr/bin/firefox' # full path os.environ['MOZ_HEADLESS'] = '1' client = Marionette('localhost', bin=firefox_binary, port=2828) try: client.start_session() client.set_window_size(width, height) client.navigate(url) with open(filename, 'wb') as file: file.write(client.screenshot(format='binary')) finally: client.quit() Для chrome можно использовать puppeteer или его аналог для Питона pyppeteer: #!/usr/bin/env python3 import asyncio import pyppeteer # $ pip install pyppeteer async def main(): browser = await pyppeteer.launch() page = await browser.newPage() await page.goto(url) await page.setViewport(dict(width=width, height=height)) await page.screenshot(path=filename, fullPage=False) await browser.close() asyncio.get_event_loop().run_until_complete(main()) Все представленные варианты только видимую часть сохраняют. При желании можно целиком страницу в виде картинки получить. К примеру, в последнем варианте, достаточно fullPage=True указать.

воскресенье, 29 марта 2020 г.

Определить xpath locator элемента на странице

#python #selenium #xpath




Мне нужно проверить/убедиться, что текст "(carrier specific)" существует и лежит
в нужном месте.

Я делаю

try: self.assertEqual("(carrier specific)", sel.get_table("//form/fieldset[4]/table.2.1"))


но он никак не хочет "подцепить" этот текст (обращается к пустому полю National prefix,
но не к тексту сразу за ним). Мне нужно как-то определить локейшн этого текста на страничке,
т.е. обратиться к этому элементу через xpath/css.

Dialing Location


Ответы

Ответ 1



xpath для получения текста из описанной вами ноды: //input[@name='dl-ntp']/../text()[boolean(string-length(normalize-space(.)))] xpath для проверки совпадения ожидаемого текста в описанной ноде: //input[@name='dl-ntp']/ancestor::*[1][contains(.,'carrier specific')] Если используете python, то может пригодиться: driver.execute_script("return document.evaluate('//input[@name='dl-ntp']/../text()[boolean(string-length(normalize-space(.)))]', document, null, XPathResult.ANY_TYPE, null).iterateNext().data")

Отключение всплывающих окон через Selenium

#java #selenium #всплывающее_окно


Я пытаюсь извлечь информацию со страницы в фейсбуке, используя Selenium. (пишу на
Java). Проблема в том, что после захода на сайт, появляется всплывающее окно



И я не знаю, как его убрать. Пыталась при помощи команды 

driver.switchTo().alert().dismiss();


Или

driver.switchTo().alert().accept();


Но не реагирует. 
Помогите пожалуйста.
    


Ответы

Ответ 1



Я нашла ответ на свой вопрос. При создании объекта WebDriver, нужно было настроить отключение уведомлений от браузера. ChromeOptions options = new ChromeOptions(); options.addArguments("--disable-notifications"); System.setProperty("webdriver.chrome.driver","path/to/driver/exe"); WebDriver driver =new ChromeDriver(options); Проблема решена.

Как отключить автопросмотр PDF и как скачать файл без подтверждения в Firefox?

#python #python_3x #selenium #selenium_webdriver #firefox


Браузер инициализируется следующим образом:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions

options = FirefoxOptions()
            options = FirefoxOptions()
            profile = webdriver.FirefoxProfile()
            profile.set_preference("browser.download.folderList", 2)
            profile.set_preference("browser.download.manager.showWhenStarting", False)
            profile.set_preference("browser.download.manager.useWindow", True)
            profile.set_preference("browser.download.dir", "" + dwnld_path + "")
            profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf,application/msword,text/csv")

self.wd = webdriver.Firefox(firefox_profile=profile, options=options, capabilities={"marionette":
True}, executable_path="" + wd_path + "/geckodriver.exe",
                                            firefox_binary="C:/Program Files/Mozilla
Firefox 60/firefox.exe")


Но, тем не менее, при загрузке файла все равно появляется диалоговое окно, с которым
ничего не происходит.

Отсюда возник вопрос: а Firefox вообще может сохранять файлы, которые скачиваются
не по ссылке, а подсовываются через JS?
    


Ответы

Ответ 1



дело оказалось в настройке по умолчанию "Предпросмотр PDF", что решилось дополнительной преференсой: profile.set_preference("pdfjs.disabled", True)

суббота, 7 марта 2020 г.

Установить selenium webdriver chromedriver на linux, используя python

#python #linux #ubuntu #selenium #selenium_webdriver


Я на стадии настройки Selenium на Ubuntu. Хочу использовать python 3.5 и chrome browser.
Я установила pip3 и python 3.5. Скачала selenium и chromedriver через терминал и pip3.
Сейчас я ничего не могу запустить, потому что получаю ошибку при загрузке webdriver:



Полагаю, проблема в версии pip. Похоже, используется pip вместо pip3 - но как заставить
работать pip3?
    


Ответы

Ответ 1



Проблема была не в pip и не в версиях питона, а в том что на моей ubuntu стоял хром не последней версии. А хромдрайвер я естесственно скачала последний. Только после апдейта хрома все заработало.

Ответ 2



Думаю, что у Вас просто не установлен pip3. Для того, чтобы его установить, нужно сделать apt-get. Предварительно, право, обновите его: sudo apt-get update Далее можете ставить pip3: sudo apt-get install python3-pip Если же вдруг окажется, что pip3 поставлен, то в любом случае, попробуйте его переустановить: sudo apt-get remove python3-pip Что касается pip и pip3. Первый объект, как правило относится к python2.7. Второй -- к python3.5. Часто бывает так, что при установке версии 2.7 pip устанавливается сразу. С pip3 обычно больше косяков. Его нужно подтянуть apt-get, как я указал выше. Но нужно понимать, что по неведомым мне причинам при установке пакетов для 3 версии, проблем возникает гораздо больше, чем при работе со 2 версией. Что касается selenium и webDriver, то устанавливать Вам нужно именно selenium. По крайней мере, на 2 питоне вместе с ним в комплекте идёт и webdriver для большого кол-ва браузеров. Сделать это можно, очевидно, так: sudo pip3 install selenium После проделанных операций, по идее, всё будет более или менее ставиться из PyCharm, в котором Вы работаете.

среда, 4 марта 2020 г.

Selenium. Всплывание окна на передний фон

#c_sharp #selenium


Если запустить слудующий код, то при каждой итерации цикла браузер будет всплывать
на передний фон и получать фокус. 

public class Program
{
  private static void Main()
  {
    var driver = new ChromeDriver();
    driver.Navigate().GoToUrl("https://i.imgur.com/cdA7SBB.jpg");
    for (int i = 0; i < 100; i++)
    {
      var ss = ((ITakesScreenshot)driver).GetScreenshot();
      ss.SaveAsFile("D:/imgs/i.jpg");
    }
  }
}


Вопрос: почему так происходит и можно ли как то это выключить?
headless мод не подходит.

Похоже что это происходит всегда когда Selenium нужно сохранить/прочитать файл или
запустить процесс.

Update:
Спасибо большое Florent B. за помощь в решении данного вопроса. Вот правильный ответ
Selenium. Bring-up window on the front

    


Ответы

Ответ 1



Смею предположить, что такое поведение это необходимость при снятии скриншота. Во время обычных действий Selenium не требует активации окна. Чтобы окно браузера не мешало, можно запускать его в докере. Вот образы и краткая инструкция - https://github.com/SeleniumHQ/docker-selenium

Ответ 2



это непростая задача и ее сложно сконфигурировать "через настройки", но я могу предложить достаточно простое решение для вас. развернуть у себя docker. Инструкция для Windows машин развернуть Standalone Chrome. Более подробная инструкция тут docker run --rm -d -p 4444:4444 --name hub selenium/standalone-chrome Настроить Capacity для работы с удаленным драйвером var uri = 'uri_to_your_hub'; // в данном случае будет http://localhost:4444/wd/hub var capabilities = new ChromeOptions().ToCapabilities(); var commandTimeout = TimeSpan.FromMinutes(5); var driver = new RemoteWebDriver(new Uri(uri),capabilities,commandTimeout) Таким образом, браузер будет запускаться внутри контейнера, вы подключайтесь у нему удаленно и работаете. Вы можете перейти по ссылке http://localhost:4444/wd/hub и увидеть запущенные сеансы и даже посмотреть на скриншот конкретного сеанса. Также можно добиться того, чтобы все запустилось от имени системного пользователя. Тогда вы тоже ничего не увидите. UPDATE можно воспользоваться PhantomJSDriver. DesiredCapabilities dc = DesiredCapabilities(); dc.SetCapability("phantomjs.binary.path", "path/to/phantomjs"); var driver = = new PhantomJSDriver(ds); driver.Navigate().GoToUrl("https://i.imgur.com/cdA7SBB.jpg"); for (int i = 0; i < 100; i++) { var ss = ((ITakesScreenshot)driver).GetScreenshot(); ss.SaveAsFile("D:/imgs/i.jpg"); } UDPATE 2 webdriver иногда фокусит окно при взаимодействий. Необязательно, чтобы выполнить действия, даже если просто поищете элемент. По этой причине нет решений, чтобы тесты запускались в интерактивном режиме и при этом нет фокусились. Для этого придумали другие решения, такие как контейнеры, PhantomJS, HtmlUnit, --headless(с 59 версии хрома).

среда, 26 февраля 2020 г.

Как поснимать checkbox

#html #python_3x #selenium #selenium_webdriver #xpath


Имеется Чек Бокс вот такого вида, как на него нажать, при помощи, Python + Selenium?    



    


Ответы

Ответ 1



Альтернативный, более лаконичный, и, кстати, быстрый способ нахождения этого элемента - это "by css selector": checkbox = browser.find_by_css_selector("input[testid=ns-chbox]") checkbox.click()

Ответ 2



checkbox1 = browser.find_element_by_xpath("//input[@testid='ns-chbox']") checkbox1.click()

пятница, 14 февраля 2020 г.

Как настроить Socks5 proxy на Selenium для chrome в python?

#python #python_3x #selenium #selenium_webdriver #socks5


никак не получается настроить socks5 прокси (и http кстати тоже) на Selenium. Перепробовал
кучу способ. И через опции

self.options.add_argument('--proxy-server=http://'+proxy)


и через 

webdriver.DesiredCapabilities.CHROME['proxy'] = {
        "socksProxy": proxy,
        "ftpProxy": proxy,
        "sslProxy": proxy,
        "noProxy": None,
        "proxyType": "MANUAL",
        "class": "org.openqa.selenium.Proxy",
        "autodetect": False
    }


И тд. Видимо где то я делаю ошибку, пожалуйста опишите полностью рабочий пример настройки
socks5 прокси на Selenium для Python и Chrome webdriver, с привидением форматов строки
прокси(ибо может я тут туплю...). Пишу от безысходности уже...Заранее большое спасибо!

PS два типа проблем возникали при попытках установить прокси разными способами: 


Просто оставался старый айпишник, не ставился прокси.
Пропадал доступ в интернет через webdriver. 
Просто почему то очень много способов в интернете находил, но результата пока что
не добился


Update:
Попробовал способом предложенным ниже. IP не удается изменить

proxy = 'name:pass@ip:port'
service_args = ['--proxy='+proxy, '--proxy-type=socks5']
driver = webdriver.Chrome(executable_path=path_to_chrome_webdriver, 
                          service_args=service_args)
driver.get('https://2ip.ru/')


Update:
Получилось использовать прокси socks5 без аутентификации с помощью следующего кода:

 options = webdriver.ChromeOptions()
 options.add_argument('--proxy-server=socks5://' + proxy)
 driver = webdriver.Chrome(options=self.options)


При добавлении

 options.add_argument('--proxy-auth=' + proxy_auth)


Пропадает подключение
    


Ответы

Ответ 1



Попробуйте через service_args: service_args = ['--proxy=127.0.0.1:9050', '--proxy-type=socks5', '--proxy-auth=admin:admin'] driver = webdriver.Chrome(executable_path=path_to_chrome_webdriver, service_args=service_args) Update: proxies = [ { 'addr': '123.123.123.123:1234', 'auth': 'admin:admin' }, { 'addr': '200.2.2.2:7868', 'auth': 'foo:bar' }, ] for proxy in proxies: service_args = ['--proxy=' + proxy['addr'], '--proxy-type=socks5', '--proxy-auth=' + proxy['auth']] driver = webdriver.Chrome(executable_path=path_to_chrome_webdriver, service_args=service_args) driver.get('https://2ip.ru/') driver.close()

Ответ 2



Хром не поддерживает прокси с аутентификацией по логину и паролю Я в этом не уверен, но очень много информации изучив я пришел к этому. Единственное решение, которое для меня подходит - это использовать прокси без аутентификации по логину и паролю (можно использовать аутентификацию по IP) options = webdriver.ChromeOptions() proxy = '12.12.421.125:1949' options.add_argument('--proxy-server=socks5://' + proxy) driver = webdriver.Chrome(options=self.options)

Как замедлить имитацию ввода символов selenium

#python #python_3x #selenium


Как замедлить имитацию ввода символов:

При использовании функции .send_keys вводимые предложения из переменной съедаются
и пишутся не сначала, а где-то с середины

text_message = 'bla-bla-bla-bla-bla-bla-bla-blabla-blabla-bla-bla-bla-bla-bla'

buf = driver.find_elements_by_class_name('im-chat-input--text')
buf.time.sleep(wait_1).set(text_message).set_value(text_message).time.sleep(wait_1).send_keys(Keys.ENTER)


как написать sleep правильно?
    


Ответы

Ответ 1



Можно замедлить таким образом: text_message = 'bla-bla-bla-bla-bla-bla-bla-blabla-blabla-bla-bla-bla-bla-bla' buf = driver.find_elements_by_class_name('im-chat-input--text') for ch in text_message: buf.send_keys(ch) time.sleep(wait_1) buf.send_keys(Keys.ENTER)

воскресенье, 26 января 2020 г.

Запуск тест-сьютов юнит-тестов в PyCharm

#python #selenium #pycharm #юнит_тесты


Есть следующий файл:
SomeTest1.py 

    __author__ = 'vbilohorodskyi'

import unittest
from selenium import webdriver
from selenium.webdriver.common import keys


class InitDriverTest(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    print("=========================================================")

    #initializing browser and verifying if the selected URL is accessible and has
correct content by key values
    def testInit_driver_and_url(self):
        driver = self.driver
        driver.get("somesite.com")
        assert "Some title" in driver.title

        print("Init driver and url: PASS")

    def tearDown(self):
        self.driver.quit()

    if __name__ == "__main__":
        unittest.main()


И есть второй файл с такой же архитектурой, но другим тест-кейсом.

Оба этих файла находятся в одном Python Package, и отдельно запускаются без проблем.
Как только пытаюсь запустить все тесты с пекеджа, наблюдаю ошибку 

Process finished with exit code 0
Empty test suite.


файл init.py для данного пекеджа пустой. 

Пробовал менять конфигурацию Runner'а, игрался с названиями классов и методов(test-
вначале и -Test в конце), пробовал разные Regexp'ы в качестве паттерна в конфигурации
Runner'а, но ничего не помогло. 

Кто-нибудь сталкивался с этой проблемой? 
Буду признателен за помощь в настройке запуска тест-сьютов из пекеджа.
    


Ответы

Ответ 1



У меня успешно работает такая конфигурация тестов: Настройки: "All in folder", указана папка (не пакет) с тестами: tests. Никаких шаблонов не указано. Рабочая папка — папка всего проекта. Вот как выглядит папка с тестами: Все файлы имеют префикс test_, все классы унаследованы от unittest.TestCase и имеют префикс Test. Версия PyCharm Community Edition 5.0.3. Кроме этого, у вас в примере с табуляциями беда. if __name__ == "__main__": не должен иметь табуляции впереди.

Ответ 2



Путём пары попыток выяснилось, что для обработки всех тестов в каталоге есть 2 варианта: все имена файлов с тестами начинать с test_ ни одного имени файла не начинать с test_, а в конфигурации в качестве паттерна указать *.py __init__.py не нужен, т.к. вряд ли будем импортировать.

Ответ 3



Все тесты запустятся, если следовать правилу - файлы с тестами должны содержать в имени строку «test_», имена классов — начинаться с «Test», а методов — со строки «test_».

Ответ 4



Содержание выделенного __init__.py (не выделенный __init__.py - пустой): __all__ = ['ex01', 'ex02'] Содержание ex01.py: import unittest class TestCase01(unittest.TestCase): def test_003(self): self.assertEqual(True, True) Содержание ex02.py: import unittest class TestCase02(unittest.TestCase): def test_001(self): self.assertEqual(True, True) Содержание run_test_package.py: import unittest from tests_package.ex01 import * from tests_package.ex02 import * if __name__ == '__main__': unittest.main() Запускаем run_test_package.py и скрипты тестов выполняются.

пятница, 24 января 2020 г.

Тест, экспортированный с Selenium не воспроизводится на Python

#python #python_2x #selenium


При воспроизведении теста, экспортированного из Selenium производится такая ошибка:


  ERROR: test_fdefd (main.Fdefd)


Traceback (most recent call last):
  File "C:\Users\user\Desktop\Tests\fdefd.py", line 12, in setUp
    self.driver = webdriver.Firefox()
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line
80, in __init__
    self.binary, timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\extension_connection.py",
line 52, in __init__
    self.binary.launch_browser(self.profile, timeout=timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_binary.py",
line 68, in launch_browser
    self._wait_until_connectable(timeout=timeout)
  File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\firefox_binary.py",
line 108, in _wait_until_connectable
    % (self.profile.path))
WebDriverException: Message: Can't load the profile. Profile Dir: c:\users\user\appdata\local\temp\tmpeywhqv
If you specified a log_file in the FirefoxBinary constructor, check it for details.



  Ran 1 test in 93.277s
  
  FAILED (errors=1)


Код программы:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Fdefd(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "http://bugscatcher.net/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_fdefd(self):
        driver = self.driver
        driver.get("http://automated-testing.info/t/selenium-podbiraem-lokatory/2269")
        driver.find_element_by_id("site-logo").click()

    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()

    


Ответы

Ответ 1



Код который генерирует Selenium IDE, надо править, но вы сможете это не раньше чем поймете что и где в коде происходит. Не буду гадать что вы пытались проверить своим тестом, но например найти в яндексе слово "Selenium" , а потом проверить что в результатах есть их сайт можно следующим способом. (Python 3.x). Если нужны будут пояснения по коду, можете обращаться. import unittest from selenium import webdriver class testClass(unittest.TestCase): def setUp(self): self.driver = webdriver.Firefox() self.driver.get("https://www.yandex.ru") self.driver.implicitly_wait(10) def test_log_in(self): element_input = self.driver.find_element_by_xpath('//input[@id="text"]') element_input.send_keys('Selenium') element_button_find = self.driver.find_element_by_xpath('//div[@class="search2__button"]/button') element_button_find.click() try: self.driver.find_element_by_link_text('Selenium - Web Browser Automation') except Exception as err: print('Some error:', err) def tearDown(self): print("Close browser") self.driver.close() if __name__ == "__main__": unittest.main()

воскресенье, 12 января 2020 г.

Selenium и клик по кнопке

#xpath #selenium #java


Здравствуйте.
Есть такая кнопка: 


Пытаюсь нажать её так:

driver.findElement(By.xpath("//input[@class=\"button primary\"][0]")).click();

Не выходит.Прошу помощи.    


Ответы

Ответ 1



Привет. Используйте следующий код driver.findElements(By.xpath(".//input[@class='button primary']")).get(0).click

Ответ 2



Посмотри используя firebug находится ли твой элемент в пределах заданной страницы в коде css. Возможно при даже верном xpath тебе не удасться это сделать. Таким образом найдя видимый элеент кликай на него, можно пробовать js (JavascriptExecutor) или action (Actions) на крайняк. Кстати твой xpath можно написать так: //input[@value='Начать переписку'] //input[@type='submit'] //input[@accesskey='s'] //input[@class='button primary'] - наиболее подходит

Ответ 3



driver.findElement(By.xpath("//input[@class='button primary']")).click();

Запуск тестов в разных браузерах одновременно

#selenium #junit #selenium_webdriver


Как запустить один и тот же тест в нескольких браузерах одновременно? 

Пытался использовать Selenium grid, но не хватило знаний и навыков гугления. 

Запускаю на своей машине Windows 8.1
Использую JUnit Webdriver 2.0 maven
    


Ответы

Ответ 1



Параллельный запуск тестов является одним из мощных средств для ускорения тестирования. Хорошо автоматизированные тесты должны быть независимыми, изолированными и воспроизводимыми, эти качества делают их идеальными для одновременного выполнения. Однако на практике не все тестовые классы разработаны с возможностью параллельного запуска. Такие аспекты, как общие изменяемые переменные, общий доступ к файлу и базе данных, или использование встроенного веб-сервера, могут сделать параллельный запуск тестов очень сложным или вообще невозможным. Тем не менее, одновременный запуск тестов, определенно, очень полезная вещь. Начиная с версии 4.7 в JUnit была добавлена возможность параллельного запуска, для этого нужно настроить Maven следующим образом: [...] org.apache.maven.plugins maven-surefire-plugin 2.12.3 methods [...] Атрибут parallel может принимать значения «classes», «methods» или «both». При этом нельзя однозначно утверждать о количестве запущенных одновременно тестов, это напрямую зависит от параметров компьютера и настроек плагина по-умолчанию. Во время запуска теста найдите следующую строку в консоли, она позволяет узнать параметры с которыми выполняется параллельный запуск: ------------------------------------------------------- T E S T S ------------------------------------------------------- Concurrency config is parallel='methods', perCoreThreadCount=true, threadCount=2, useUnlimitedThreads=false Атрибут threadCount позволяет указать, сколько потоков должно быть выделено для запуска тестов (сколько тестов должно запускаться параллельно). Обратите внимание, что его использование с параметром perCoreThreadCount, установленным в true, может исказить реальное количество запускаемых одновременно тестов. В то же время perCoreThreadCount позволяет добиться большей гибкости при запуске тестов на разных машинах. Например, при запуске тестов со следующей конфигурацией на машине с 2-х ядерным процессором, одновременно будут выполняться 4 тестовых класса, а не 2: [...] org.apache.maven.plugins maven-surefire-plugin 2.12.3 classes true 2 [...] Существует еще такой атрибут как useUnlimitedThreads. При его использовании будет создаваться столько потоков, сколько классов или методов в Вашем проекте, и все тесты будут пытаться запуститься одновременно. useUnlimitedThreads отлично работает для юнит-тестов, но для функционального web тестирования его лучше не использовать. Настройки конфигурации полностью зависят от характера Ваших тестов, поэтому стоит поэкспериментировать с различными конфигурациями и посмотреть, какой из вариантов настройки больше всего подходит для Вас. Информация взята с Блога вебразработчика В будущем советую все таки использовать Google. И не бояться эксперементировать со своим проектом. Надеюсь предоставленная информация Вам поможет, удачи в дальнейших трудах)

пятница, 10 января 2020 г.

Как закрыть консоль после выполнения приложения?

#c_sharp #console #selenium #selenium_webdriver


Приложение Selenium, после выполнения консоль остается на экране. Выкинул все из
кода, оставил только инициализацию и закрытие драйвера - все по-прежнему. Что делать?

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;

namespace Myspace
{
    class Program
    {
        static void Main(string[] args)
        {
            IWebDriver driver = new ChromeDriver();

            driver.Close();

        }
}

    


Ответы

Ответ 1



Попробуйте так: using OpenQA.Selenium; using OpenQA.Selenium.Chrome; namespace ConsoleApp4 { public class Program { private static void Main() { IWebDriver driver = new ChromeDriver(); driver.Quit(); } } } Похоже что это баг, на их баг-трекере баг заведен. WebDriver.close() does not close browser window UPD: Кстати если использовать оператор using то всё закрывается корректно: private static void Main() { using (IWebDriver driver = new ChromeDriver()) { } //driver.Quit(); } Потому что метод Dispose как раз использует операцию Quit: protected virtual void Dispose(bool disposing) { try { this.Execute(DriverCommand.Quit, null); } /*...*/ }

четверг, 9 января 2020 г.

Java Selenium запись видео

#java #selenium #selenium_webdriver


На сайте есть анимационный блок, анимация которого производится с применением html5,
css, и js. Можно ли как то записать эту анимацию в gif? Использую selenium и метод
getScreenshotAs. 

Изначально задумка была такая: наделать кучу скриншотов, а потом слепить их в gif
файл, но проблема в том, что через метод getScreenshotAs скриншот делается очень долго(350-400мс),
поэтому нет никакой плавности(получается 3-4 кадра в секунду, а то и меньше). 

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


Ответы

Ответ 1



Можно отрисовывать Selenium на виртуальный фреймбуфер Xvfb и записывать видео, например, через ffmpeg. Запускаете сервер Xvfb, а в нём браузер: xvfb-run --listen-tcp --server-num=123 --auth-file /tmp/xvfb.auth -e /dev/stdout -s "-ac -screen 0 1024x768x24" firefox ru.stackoverflow.com 123 - номер дисплея xserver на ваш выбор /tmp/xvfb.auth - путь, по которому будет сохранены авторизационные данные 1024x768x24 - желаемая геометрия фреймбуфера firefox ru.stackoverflow.com - открывает этот сайт в Firefox; замените на вашу строку запуска Selenium Чтобы начать писать видео: ffmpeg -f x11grab -i :123 -video_size 1024x768 -codec:v libx264 -r 12 video.mp4 -f x11grab -i :123 - источник видеопотока: xserver, 123й дисплей -video_size 1024x768 - разрешение видеофайла libx264 - желаемый видеокодек -r 12 - частота кадров Для gif-файла кодек указыать не нужно: ffmpeg -f x11grab -video_size 1024x768 -i :123 -r 12 1.gif Чтобы снять скриншот (требуется установленный ImageMagick): xwd -display :123 -root | convert xwd:/dev/stdin png:1.png -display :123 - все тот же 123й дисплей -root - не имеет отношения к пользователю root; указывает, что нужен скриншот всего рабочего стола, а не конкретного окна

пятница, 27 декабря 2019 г.

Selenium with Python, запуск тестов на выбор по параметру

#python #selenium


Доброго времени суток.
Занимаюсь тестированием, пользуюсь  Селениумом и Пайтоном.

Встала необходимость записать все тесты в 1 файл и запускать скрипт с параметрами
и чтобы, выполнялись, так сказать выбранные тесты.

Чую, что не хватает фундаментальных знаний, но гугление по конкретике, не привело
 ни к ответу, ни к направлению где искать.

Сейчас тесты у меня разбиты по разным файлам, и в каждом захардкожено, куда заходить,
 какй логин пароль и прочее.

class loginTest(unittest.TastCase):

def setUp(self):
    #открываю браузер и нужную страницу
def test_1(self):
    # логинюсь и выполняю набор кейсов
def test_2(self):
    # логинюсь и выполняю набор кейсов
def test_3(self):
    # логинюсь и выполняю набор кейсов
def test_4(self):
    # логинюсь и выполняю набор кейсов
def tearnDown(self):
    #Забираю из памяти теста лог, организую отчёт

if __name__ == '__main__':
    unittest.main()


То, что я хочу сделать выглядит макетно так, но как мне при запуске скрипта выбирать,
запустить тест 1 и 4 или любой другой набор, идей нет. Кто сталкивался с таким, подскажите,
рад буду даже ссылке, где можно почитать.
    


Ответы

Ответ 1



Как итог, нашёлся способ как запускать выбранные тесты. Делаем это через Suite, а приклеить к функции параметр уже не сложно. # -*- coding: utf-8 -*- from selenium import webdriver import unittest class testsall (unittest.TestCase): def test_open_page(self): wd = webdriver.Firefox() wd.maximize_window() wd.implicitly_wait(60) wd.get("http://ukr.net") wd.close() def suite(): suite1 = unittest.TestSuite() suite1.addTest(testsall("test_open_page")) return suite1 if __name__ == "__main__": with open('/home/andrey/test.log','w') as logf: unittest.TextTestRunner(verbosity=2, stream = logf).run(suite())

Ответ 2



перед test поставьте любой символ. Метод будет игнорироваться. Или закомментить. Пример: def _test_1(self): Хотя может я не прав. Только 3 день как учу пайтон) (поправьте меня если бред сгенерил:) )

Скриншоты в Selenium

#java #selenium


Использую Java + Selenium Webdriver. Есть задача:


Сделать 4 скриншота (с интервалом в 5 секунд).
Для каждого скриншота получить и сохранить md5-хэш.
Сравнить полученные значения хэшей (все должны быть разным). 


Помогите разобраться, что и как зачем? 

Чтобы сделать скриншот можно вызвать метод getScreenshotAs(OutputType target):

File screenShot = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
BufferedImage screenshotImage = ImageIO.read(screenShot);



В первой строке мы делаем скриншот.
Преобразовываем его в BufferedImage - Почему так нужно или не нужно делать?
Как мне сохранить скриншот на компьютер?

    


Ответы

Ответ 1



код для шарпа(практически идентичный с джавой) Screenshot myScreenShot = ((ITakesScreenshot)webDriver).GetScreenshot(); myScreenShot.SaveAsFile(screenShotFileAdress, System.Drawing.Imaging.ImageFormat.Png); закинь в цикл с Thread.Sleep(5000); в конце тела цикла. с хешами сам разберешься (и не уверен что тебе вообще нужно сохранять изображения, лучше закинь их в какой-нибудь Лист и генери мд5 с битмапов, что б потом просто сравнять =) Сохранять сами изображения не обязательно )

Ответ 2



Пример из моего кода: File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcfile, new File("path_to_save" + "Screenshot_" + getTimeStamp() + ".png"));

Ответ 3



// take a screen shot: File sceFile = driver.getScreenshotAs(OutputType.FILE); DateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy__hh_mm"); String fileName = UUID.randomUUID().toString(); File targetFile = new File("path\\to\\screenshots\\" + dateFormat.format(new Date()) + fileName + ".jpg"); FileUtils.copyFile(sceFile, targetFile);

понедельник, 16 декабря 2019 г.

Как с помощью selenium(java) найти push уведомление браузера и кликнуть по нему?

#java #selenium


Как с помощью selenium(java) дождаться push уведомление браузера и когда оно появится
кликнуть по нему ? Использую драйвер chrome и selenium 3. 
вот пример сообщения 



    


Ответы

Ответ 1



Если я не ошибаюсь, то каждая нотификация может работать по-другому. Решение 1. В консоли браузера добавляем JS код, который будет печатать нам URL нотификации. Мы собираем эти данные и сами решаем какой именно URL нам нужно. // это JS if ('Notification' in window) { messaging.onMessage(function(event) { console.log('url is: ', event.notification.click_action); }); } // Это Java String js = "if ('Notification' in window) {\n" + " messaging.onMessage(function(event) {\n" + " console.log('url is: ', event.notification.click_action);\n" + " });\n" + "}"; ((JavascriptExecutor) driver).executeScript(js); Далее собираем логи с консоли, после появления нотификации и обрабатываем. Логи можно получить следующим образом: getDriver().manage().logs().get(LogType.BROWSER).getAll(); Напоминаю, что каждый вызов возвращает только НОВЫЕ логи. Также нужно включить поддержку логов при старте браузера LoggingPreferences logging = new LoggingPreferences(); logging.enable(LogType.BROWSER, Level.ALL); capabilities.setCapability(CapabilityType.LOGGING_PREFS, logging); Решение 2. В консоли браузера добавляем JS код, который будет автоматически переходить по ссылке нотификации. Минус подхода в том, что если будет много нотификации за раз, то перейдет только по одному URL-у. if ('Notification' in window) { messaging.onMessage(function(event) { console.log('url is: ', event.notification.click_action); window.location.href = event.notification.click_action; }); } Полезные ссылки: раз, два протестировать можно тут открыть сайт. Открыть DevTools. в консоль(вкладка Console) выполнить первый или второй JS скрипт. нажать кнопку SEND первый скрипт напечатает в консоле "url is: www...", второй скрипт дополнительно перейдет по этому URL

вторник, 10 декабря 2019 г.

не работает socks5 proxy в связке Python3 Selenium3 Phantomjs2

#python #proxy #selenium #phantomjs #socks5


Вот код который пытаюсь выполнить:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time

ua = dict(DesiredCapabilities.PHANTOMJS)
ua["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Windows NT 10.0; Win64;
x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36")
service_args = ['--proxy=109.228.147.75:45554','--proxy-type=socks5','--load-images=false','--ignore-ssl-errors=true']
browser = webdriver.PhantomJS(desired_capabilities=ua, service_args=service_args)
browser.set_window_size(1920, 1080)
browser.get('http://www.ip-adress.com/')
time.sleep(10)
browser.save_screenshot('screen_test.png')


Если использовать socks5, то при выполнении кода PhantomJS не может загрузить сайт,
оставаясь в подвешенном состоянии, можно ждать вечность и ничего не произойдёт. Если
завершить процесс PhantomJS то IDLE прервётся на команде:

browser.get('http://www.ip-adress.com/')


В Мозиле (не в коде, а просто в окне) с этим же proxy сайт открывается.

Если заменить прокси на https тип, то всё заработает.

Однако, через socks5 загружается http://example.com/. То есть только он. Ни один
другой сайт не грузится. => Из-за этого подозреваю что проблема с DNS запросами, но
как это фиксить?

Python 3.5 / Selenium 3.0.1 / PhantomJS 2.1.1
    


Ответы

Ответ 1



Всё дело в самом proxy. Я так до конца и не понял в чём всё же фишка, но как итог, нужно проверять proxy на работающий DNS Forwarding. Просто работающих соксов много, а вот с адекватным DNS F мне как-то попалось значительно меньше. Как я понял, PhantomJS при использовании socks5 по умолчанию использует DNS Forwarding, по этому и ждёт, когда-же сервер ему ответит. Однако настройки как в Мозиле: у Фантома нет, и отключить проксирование DNS запросов у Фантома нельзя. Хотя я не исключаю, что не прав до сих пор, и реально ответ в другом. Спасибо))

вторник, 16 июля 2019 г.

Использовать прокси с авторизацией, через Selenium на java

Задача: запустить браузер с подключение через прокси для подключения к которому необходимо проходить аутентификацию.

Для установки прокси в браузере вручную, прописываю адрес и порт в настройках соединения браузера. После этого, при первом доступе к любому серверу в браузере вылезает диалоговое окно для прохождения авторизации (basic authorization). После ее прохождения все запросы проходят через прокси.
В селениуме пробовал делать так:
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setHttpProxy(":@

:"); proxy.setSslProxy(":@
:"); DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new FirefoxDriver(capabilities);
В этом случае в конфигурации подключения браузера на место адреса прокси устанавливается , а порт дэфолтный ( ноль ). Если дописать http://, то вместо адреса вставляется http, а порт ноль.

И еще, пробовал так:
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setHttpProxy("
:"); proxy.setSslProxy("
:"); DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new FirefoxDriver(capabilities);
В этом случае адрес и порт прописываются правильно и после запуска браузера (на строке WebDriver driver = new FirefoxDriver(capabilities);) появляется диалоговое окно с текстом Прокси «moz-proxy://
:» запрашивает имя пользователя и пароль. Сайт сообщает: «proxy» и полями для ввода логина и пароля, выполнение программы приостанавливается, что не дает возможность воспользоваться созданным объектом driver для переключения на окно и ввести логин и пароль (driver.switchTo().alert()....).

Также нагуглил вариант:
org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setHttpProxy("
:"); proxy.setSslProxy("
:"); proxy.setSocksUsername(""); proxy.setSocksPassword(""); DesiredCapabilities capabilities = DesiredCapabilities.firefox(); capabilities.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new FirefoxDriver(capabilities);
Но результат такой-же как и во втором случае.

Работать должно как минимум в Firefox, а в идеале еще и в PhantomJS. В принципе, не будет лишней поддержка Chrome, но это не обязательно.

Update
Неужели никто не сталкивался с таким?
Я пробовал использовать еще такой вариант:
DesiredCapabilities capabilities = new DesiredCapabilities(); // DesiredCapabilities.firefox(); FirefoxProfile profile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 1); profile.setPreference("signon.autologin.proxy" , true); profile.setPreference("network.websocket.enabled", false); profile.setPreference("network.proxy.share_proxy_settings", false); profile.setPreference("network.automatic-ntlm-auth.allow-proxies", false); profile.setPreference("network.http.phishy-userpass-length", 255); profile.setPreference("network.auth.use-sspi", false); profile.setPreference("network.proxy.http", "
"); profile.setPreference("network.proxy.http_port", ); profile.setPreference("network.proxy.ssl", "
"); profile.setPreference("network.proxy.ssl_port", ); capabilities.setCapability(FirefoxDriver.PROFILE, profile); org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy(); proxy.setProxyType(ProxyType.MANUAL); proxy.setSocksUsername(""); proxy.setSocksPassword(""); capabilities.setCapability(CapabilityType.PROXY, proxy); WebDriver driver = new FirefoxDriver(capabilities); driver.get("http://2ip.ru");
Если устанавливать конфигурацию прокси через профайл фаерфокса ( profile.setPreference(...) ), то окно для авторизации через прокси появляется немного раньше окна браузера (браузер запускается примерно за 1 секунду, а окно для авторизации появляется примерно на пол секунды раньше) и при этом, в отличии от вариантов реализации из предыдущего сообщения, не блокирует главное окно (которое запускается/отображается немножко позже). Также в этом варианте выполнение программы не приостанавливается на строке создания драйвера (new FirefoxDriver(capabilities);). Программа приостанавливается на строке driver.get("http://2ip.ru"); , браузер при этом ожидает ответ от 2ip.ru, до тех пор пока я не введу вручную данные для авторизации прокси, если авторизация не удалась, то вместо запрошенной страницы получаю сообщение - "Прокси-сервер отказывается принимать соединения".
Вопрос: как можно получить доступ к окну авторизации для дальнейшего ввода логина и пародя или как пройти авторизацию на прокси сервере не выводя окно для авторизации ( примерно как я пробовал: proxy.setSocksUsername(""); proxy.setSocksPassword("" ); )?


Ответ

Решил через AutoItX4Java:
private void mozProxyAuth(String login, String password) { String JACOB_DLL_TO_USE = System.getProperty("sun.arch.data.model").contains("32") ? "jacob-1.18-x86.dll" : "jacob-1.18-x64.dll"; File file = new File(System.getProperty("user.dir"), JACOB_DLL_TO_USE); System.setProperty(LibraryLoader.JACOB_DLL_PATH, file.getAbsolutePath()); AutoItX x = new AutoItX(); if (x.winWait("Требуется аутентификация", null, 10)) { x.winActivate("Требуется аутентификация"); x.send(login + "{TAB}" + password + "{ENTER}", false); } }

National Prefix (carrier specific)