Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenium WebDriver+Python 3. 2 сделать скрин


(Neudachnik) #1

Зараннее прошу простить мой низкий уровень, в этом деле я ещё новичок

Пытаюсь сделать скрин стандарным способом:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://google.com')
put = driver.save_screenshot('C:\screenshot__.png')

выдаёт ошибку:

Traceback (most recent call last):
  File "C:\Users\muraveven\Desktop\шаги к оптимизации тестирования\screenshot.py", line 13, in <module>
    put = driver.save_screenshot('C:\screenshot__.png')
  File "C:\Python32\lib\selenium\webdriver\remote\webdriver.py", line 818, in save_screenshot
    f.write(base64.decodestring(png))
  File "C:\Python32\lib\base64.py", line 367, in decodestring
    return decodebytes(s)
  File "C:\Python32\lib\base64.py", line 359, in decodebytes
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str
>>>

При этом файл в указанной директории создаёт но он пустой. Из аналогичных команд создания скринов отрабатывает только

put = driver.get_screenshot_as_base64()

но превратить полученное значение в картинку приводит к аналогичной ошибке

image = Image.fromstring('RGB',(1366,768),decodestring(put))
image.save("c:/foo.png")

image = Image.fromstring('RGB',(1366,768),decodestring(put))
  File "C:\Python32\lib\base64.py", line 367, in decodestring
    return decodebytes(s)
  File "C:\Python32\lib\base64.py", line 359, in decodebytes
    raise TypeError("expected bytes, not %s" % s.__class__.__name__)
TypeError: expected bytes, not str

Проблему вижу в том, что втройке наконец-то решились разделить строки и байты.

 


(Mykhailo Poliarush) #2

к сожалению, официальной поддержки webdriver для python 3 еще нет

и да, вы верно определили проблему, потому что в python 3 есть разница между bytes и str

еще не смотрел, но тут походу надо парчить webdriver python код

вся проблема вот тут вот base64.decodestring(png), сюда скорее всего нужно метод base64.decodebytes(png)

но это надо проверять и смотреть, пока что, к сожалению, нет времени


(Mykhailo Poliarush) #3

ну и ссылочку забыл добавить 

http://docs.python.org/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit


(Alexander Petrovich) #4

Я бы не изобретал велосипед и ставил бы рядышком 2.7


(Mykhailo Poliarush) #5

я бы это тоже рекомендовал


(Neudachnik) #6

Найдено решение! http://forworktests.blogspot.ru/p/selenium-web-driver.html

Для использования функции WD снятия скриншотов в .png-файл, нужно заменить в файле

<Python.....>\selenium\webdriver\remote\webdriver.py,
в методе get_screenshot_as_file из класса WebDriver, строку
f.write(base64.decodestring(png))
на строку
f.write(base64.decodestring(png.encode())).


(Alexander Petrovich) #7

Замечательно, если работает. Но меня не покидает ощущение, что вы столкнетесь еще с множеством граблей из-за третьего питона.


(Mykhailo Poliarush) #8

да можно и так решить, 
хорошо, что работает

As the str and bytes types cannot be mixed, you must always explicitly convert between them. Use str.encode() to go from str to bytes, and bytes.decode() to go from bytes to str. You can also usebytes(s, encoding=...) and str(b, encoding=...), respectively.

и вопрос, а почему вы решили именно делать все на версии 3.х?


(Neudachnik) #9

Ещё раз повторюсь, что в этом деле новичок, поэтому и подходил к выбору ПО по принципу: всё должно быть последней версии.


(Alexander Petrovich) #10

Зря :) Лучше до оф. поддержки пользуйтесь таки питоном 2.7

Оно вам надо всякий раз перелопачивать selenium?