Откройте web в новой вкладке Selenium + Python

Поэтому я пытаюсь открыть веб-сайты на новых вкладках внутри моего WebDriver. Я хочу сделать это, потому что открытие нового WebDriver для каждого веб-сайта занимает около 3,5 секунд, используя PhantomJS, мне нужна больше скорости …

Я использую многопроцессный скрипт python, и я хочу получить некоторые элементы с каждой страницы, поэтому рабочий процесс выглядит так:

Open Browser Loop throught my array For element in array -> Open website in new tab -> do my business -> close it 

Но я не могу найти никакого способа добиться этого.

Вот код, который я использую. Это происходит навсегда между веб-сайтами, мне нужно, чтобы это было быстро … Другие инструменты разрешены, но я не знаю слишком много инструментов для утилизации содержимого веб-сайта, загружаемого с помощью JavaScript (divs, создаваемые при возникновении какого-либо события при загрузке и т. Д.). Это почему мне нужен Selenium … BeautifulSoup не может использоваться для некоторых моих страниц.

 #!/usr/bin/env python import multiprocessing, time, pika, json, traceback, logging, sys, os, itertools, urllib, urllib2, cStringIO, mysql.connector, shutil, hashlib, socket, urllib2, re from selenium import webdriver from selenium.webdriver.common.keys import Keys from PIL import Image from os import listdir from os.path import isfile, join from bs4 import BeautifulSoup from pprint import pprint def getPhantomData(parameters): try: # We create WebDriver browser = webdriver.Firefox() # Navigate to URL browser.get(parameters['target_url']) # Find all links by Selector links = browser.find_elements_by_css_selector(parameters['selector']) result = [] for link in links: # Extract link attribute and append to our list result.append(link.get_attribute(parameters['attribute'])) browser.close() browser.quit() return json.dumps({'data': result}) except Exception, err: browser.close() browser.quit() print err def callback(ch, method, properties, body): parameters = json.loads(body) message = getPhantomData(parameters) if message['data']: ch.basic_ack(delivery_tag=method.delivery_tag) else: ch.basic_reject(delivery_tag=method.delivery_tag, requeue=True) def consume(): credentials = pika.PlainCredentials('invitado', 'invitado') rabbit = pika.ConnectionParameters('localhost',5672,'/',credentials) connection = pika.BlockingConnection(rabbit) channel = connection.channel() # Conectamos al canal channel.queue_declare(queue='com.stuff.images', durable=True) channel.basic_consume(callback,queue='com.stuff.images') print ' [*] Waiting for messages. To exit press CTRL^C' try: channel.start_consuming() except KeyboardInterrupt: pass workers = 5 pool = multiprocessing.Pool(processes=workers) for i in xrange(0, workers): pool.apply_async(consume) try: while True: continue except KeyboardInterrupt: print ' [*] Exiting...' pool.terminate() pool.join() 

5 Solutions collect form web for “Откройте web в новой вкладке Selenium + Python”

Вы можете открыть или закрыть вкладку комбинацией клавиш COMMAND + T или COMMAND + W (OSX). На другом SO вы можете использовать CONTROL + T / CONTROL + W

В селене вы можете эмулировать такое поведение. Вам нужно будет создать один webdriver и столько вкладок, сколько вам нужно.

Вот код.

 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.google.com/") #open tab driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't') # Load a page driver.get('http://stackoverflow.com/') # Make the tests... # close the tab driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w') driver.close() 
 browser.execute_script('''window.open("http://bings.com","_blank");''') 

Где браузер является webDriver

Основываясь на определении на веб-сайте селена: прежде всего, это для автоматизации веб-приложений для целей тестирования, но, конечно же, не ограничивается этим. Скучные задачи администрирования через Интернет могут (и должны!) Также быть автоматизированы. вы видите, что главная цель селена предназначена для тестирования, а кроме того, вы можете автоматизировать задачи администрирования, не просматривая веб-сайты. работа с такой штукой для ползания – это просто трата времени. Я хочу сосредоточиться на обходе, взгляните на http://scrapy.org, это самая распространенная структура в python для получения данных с веб-сайтов.

После долгой работы метод ниже работал для меня:

 driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.TAB) windows = driver.window_handles time.sleep(3) driver.switch_to.window(windows[1]) 

Это общий код, адаптированный из других примеров:

 from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() driver.get("http://www.google.com/") #open tab # ... take the code from the options below # Load a page driver.get('http://bings.com') # Make the tests... # close the tab driver.quit() 

Возможные пути:

  1. Отправка <CTRL> + <T> на один элемент

     #open tab driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') 
  2. Отправка <CTRL> + <T> через цепочки действий

     ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform() 
  3. Выполнить фрагмент javascript

     driver.execute_script('''window.open("http://bings.com","_blank");''') 

    Для этого вам необходимо убедиться, что настройки браузера.link.open_newwindow и browser.link.open_newwindow.restriction установлены правильно. Значения по умолчанию в последних версиях в порядке, иначе вам, возможно, понадобится:

     fp = webdriver.FirefoxProfile() fp.set_preference("browser.link.open_newwindow", 3) fp.set_preference("browser.link.open_newwindow.restriction", 2) driver = webdriver.Firefox(browser_profile=fp) 

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

    В Java есть способ установить эти настройки без указания объекта профиля при разговоре с geckodriver , но он пока еще не реализован в привязке python:

     FirefoxOptions options = new FirefoxOptions().setProfile(fp); options.addPreference("browser.link.open_newwindow", 3); options.addPreference("browser.link.open_newwindow.restriction", 2); FirefoxDriver driver = new FirefoxDriver(options); 

Третий вариант прекратил работу для python в селене 3.4.0.

Первые два варианта также, похоже, перестали работать в селене 3.4.0. Они зависят от отправки ключевого события CTRL в элемент. На первый взгляд кажется, что это проблема ключа CTRL, но он терпит неудачу из-за новой многопроцессорной функции Firefox . Может быть, эта новая архитектура навязывает новые способы сделать это или, может быть, является временной проблемой реализации. В любом случае мы можем отключить его через:

 fp = webdriver.FirefoxProfile() fp.set_preference("browser.tabs.remote.autostart", False) fp.set_preference("browser.tabs.remote.autostart.1", False) fp.set_preference("browser.tabs.remote.autostart.2", False) driver = webdriver.Firefox(browser_profile=fp) 

… и тогда вы можете успешно использовать первый способ.

  • Selenium - идентифицировать веб-элемент с помощью src или alt
  • Автоматизация действий браузера - нажатие на кнопки кнопки «Ошибка» - «Нажмите« Успешно », но« Ошибка загрузки ». ..»
  • Заполнение формы паролем с помощью Splinter
  • Есть ли способ зарегистрировать HTTP-запросы / ответы, используя Selenium Webdriver (firefox)?
  • как установить прокси-сервер для chrome в python webdriver
  • Как я могу заставить Selenium Web Driver ждать появления элемента, а не просто присутствовать?
  • Подождите, пока перенаправление страницы Selenium WebDriver (Python)
  • Selenium Webdriver + python - Не удается скрыть всплывающую подсказку после мыши над действием
  • Выполните проверку WebDriverWait () или аналогичную проверку регулярного выражения в Python
  • Пример Selenium Webdriver в Python
  • Selenium python find_element_by_class_name () перестает работать с версии 2.2 до 2.21 - не может использовать 'Compound Class Name'
  • Python - лучший язык программирования в мире.