Итак, я пытаюсь открывать веб-сайты на новых вкладках внутри моего 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
defgetPhantomData(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
Примечание редактора: Этот ответ больше не работает для новых версий Selenium. Обратитесь к этому комментарию.
Вы можете добиться открытия / закрытия вкладки комбинацией клавиш COMMAND + T или COMMAND + W (OSX). В других операционных системах вы можете использовать CONTROL + T / CONTROL + W.
В selenium вы можете эмулировать такое поведение. Вам нужно будет создать один webdriver и столько вкладок, сколько вам нужно тестов.
Вот он код.
from selenium import webdriver from selenium.webdriver.common.keys import Keys
проблема в том, что эти настройки предварительно установлены в другие значения и заморожены, по крайней мере, в selenium 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);
Первые два параметра, похоже, также перестали работать в selenium 3.4.0. Они зависят от отправки события клавиши CTRL элементу. На первый взгляд кажется, что это проблема с клавишей CTRL, но она не работает из-за новой многопроцессорной функции Firefox. Возможно, эта новая архитектура накладывает новые способы выполнения этого, или, возможно, это временная проблема реализации. В любом случае, мы можем отключить это с помощью:
# Open a new window driver.execute_script("window.open('');") # Switch to the new window driver.switch_to.window(driver.window_handles[1]) driver.get("http://pythonly.ru") time.sleep(3)
# Open a new window driver.execute_script("window.open('');") # Switch to the new window driver.switch_to.window(driver.window_handles[2]) driver.get("https://www.reddit.com/") time.sleep(3) # close the active tab driver.close() time.sleep(3)
# Switch back to the first tab driver.switch_to.window(driver.window_handles[0]) driver.get("https://bing.com") time.sleep(3)
# Close the only tab, will also close the browser. driver.close()