Вопрос-Ответ

Open web in new tab Selenium + Python

Открыть 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()
Переведено автоматически
Ответ 1

Примечание редактора: Этот ответ больше не работает для новых версий Selenium. Обратитесь к этому комментарию.


Вы можете добиться открытия / закрытия вкладки комбинацией клавиш COMMAND + T или COMMAND + W (OSX). В других операционных системах вы можете использовать CONTROL + T / CONTROL + 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://pythonly.ru/')
# 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()
Ответ 2
browser.execute_script('''window.open("http://bings.com","_blank");''')

Где браузер - это WebDriver

Ответ 3

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

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

    Для достижения этого вам необходимо убедиться, что настройки browser.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)

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

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

Первые два параметра, похоже, также перестали работать в selenium 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)

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

Ответ 4

  • ОС: Win 10,

  • Python 3.8.1

    • selenium==3.141.0


from selenium import webdriver
import time

driver = webdriver.Firefox(executable_path=r'TO\Your\Path\geckodriver.exe')
driver.get('https://www.google.com/')

# 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()

Ссылка: Нужна помощь в открытии новой вкладки в Selenium

python selenium