Открыть 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()
возможные пути были:
-
отправка
<CTRL> + <T>
в одном элементе#open tab driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
-
отправка
<CTRL> + <T>
через цепочки действийActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()
-
выполнить фрагмент 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
браузер Снимок:
база по определению Селена на сайте : В первую очередь, для автоматизации веб-приложений для тестирования, но, конечно, не ограничивается только этим. Скучные веб-задачи администрирования могут (и должны!) также автоматизируйте также. вы видите, что основная цель selenium - это тестирование, и кроме того, вы можете автоматизировать задачи администрирования, а не обход веб-сайтов. работа с такой штукой в целях ползания-пустая трата времени Я хочу, чтобы ты сосредоточилась на ползании., взгляните на http://scrapy.org это наиболее распространенная платформа в python для извлечения данных с веб-сайтов.