Selenium - скриншот с разными названиями

Я использую Selenium, чтобы сделать снимок экрана из списка URL-адресов. test.txt включают reddit.com, stackoverflow.com и spotify.com. При итерации по этому списку я хочу, чтобы он сохранял в папке Скриншоты с именем файла url + '.png'. Но это не работает. У меня либо возникают ошибки, либо он просто продолжает работать, ничего не делая. Этот работает, но он просто перезаписывает старый

screenshot = driver.save_screenshot('Screenshots/foo.png')

Я хочу, чтобы это выглядело так, но это не работает:

screenshot = driver.save_screenshot('Screenshots/', line,  '.png')

Я новичок в python, но он также не работает с использованием +. Проблема в том, что для этого нужно слишком много аргументов.

class Screenshot():

filehandle = open("test.txt", "r")
for line in filehandle:
    DRIVER = 'chromedriver'
    driver = webdriver.Chrome(DRIVER)
    driver.get(line)

    screenshot = driver.save_screenshot('Screenshots/foo.png')
    driver.quit()

Если вы используете print(line) в своем цикле, правильно ли он печатает URL-адреса?

Adam 10.08.2018 17:06

Да, хотя после строки есть разрыв строки

J. Doe 10.08.2018 17:09

Этот код должен быть частью класса ScreenShot? Или это было случайно опубликовано? Сначала я не видел этой части.

Adam 10.08.2018 17:24

Это его часть, на самом деле это целый класс, каким бы огромным он ни был.

J. Doe 10.08.2018 17:25

Ох, хорошо. Это все меняет. Разве это не под методом? То, что вы опубликовали, заставляет его выглядеть так, как будто оно «свободно плавающее» под определением имени класса (свободное плавание - это не техническое определение, а то, что я придумал, чтобы описать, как это выглядело).

Adam 10.08.2018 17:27

Да, это свободно плавающий (: p). Я знаю java и C#, но это мой первый код на python, поэтому я еще практически ничего не понял. Какие изменения я должен внести, чтобы он работал в свободном обращении?

J. Doe 10.08.2018 17:30

Сначала я бы этого не допустил. Во-вторых, вы ожидаете, что это сработает при создании экземпляра класса?

Adam 10.08.2018 17:33

Позвольте нам продолжить обсуждение в чате.

Adam 10.08.2018 17:34
0
8
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Создание класса снимка экрана не требуется для такой простой задачи.

#!/usr/bin/env python
from __future__ import print_function

import os
from selenium import webdriver


def main():
    driver = webdriver.Chrome()

    # With automatically closes files when they go out of scope
    with open('test.txt', 'r') as f:
        for url in f.readlines():
            driver.get(url)

            # os.path.join should make it platform agnostic
            # Also remove any '/' from the url and replace to avoid any file system save issues
            sn_name = os.path.join('Screenshots', url.strip().replace('/', '-') + '.png')
            print('Attempting to save:', sn_name)

            # '.save_screenshot' returns false if it fails so throw exception
            if not driver.save_screenshot(sn_name):
                raise Exception('Could not save screen shot: ' + sn_name)

    # Close browser
    driver.quit()


if __name__ == '__main__':
    main()

Однако он не сохраняет скриншоты. Он компилируется и открывает следующую строку, но ничего не сохраняется

J. Doe 10.08.2018 17:11

Вероятно, из-за символа новой строки в конце строки. Смотрите мой обновленный ответ.

Adam 10.08.2018 17:14

К сожалению, это тоже не работает. Полоса действительно удаляет новую строку (print (line.strip ())

J. Doe 10.08.2018 17:22

Другие вопросы по теме