Открыть 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, созданные, когда какое-то событие запускается при загрузке и т. д.), Поэтому мне нужен селен... 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()

6 ответов


вы можете добиться открытия/закрытия вкладок с помощью сочетания клавиш команда + T или команда + W (OSX). На других OSs вы можете использовать управления + T / управления + W.

в selenium вы можете эмулировать такое поведение. Вам нужно будет создать один 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') 
# You can use (Keys.CONTROL + 't') on other OSs

# Load a page 
driver.get('http://stackoverflow.com/')
# Make the tests...

# close the tab
# (Keys.CONTROL + 'w') on other OSs.
driver.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 'w') 


driver.close()

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

здесь обозреватель - это webDriver


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

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");''')
    

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

    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 в selenium 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)

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


после борьбы так долго этот метод работал для меня:

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])

С селен v3.x открытие сайта в Новая Вкладка через Python теперь намного легче. Вот решение, где вы можете открыть http://www.google.co.in на начальная вкладка и https://www.yahoo.com на рядом:

  • Блок Кода:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("http://www.google.co.in")
    print("Initial Page Title is : %s" %driver.title)
    windows_before  = driver.current_window_handle
    print("First Window Handle is : %s" %windows_before)
    driver.execute_script("window.open('https://www.yahoo.com')")
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
    windows_after = driver.window_handles
    new_window = [x for x in windows_after if x != windows_before][0]
    driver.switch_to_window(new_window)
    print("Page Title after Tab Switching is : %s" %driver.title)
    print("Second Window Handle is : %s" %new_window)
    
  • Консоль Вывода:

    Initial Page Title is : Google
    First Window Handle is : CDwindow-B2B3DE3A222B3DA5237840FA574AF780
    Page Title after Tab Switching is : Yahoo
    Second Window Handle is : CDwindow-D7DA7666A0008ED91991C623105A2EC4
    
  • браузер Снимок:

multiple__tabs


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