猿问
下载APP

在新标签Selenium + Python中打开网页

在新标签Selenium + Python中打开网页

所以我试图在我的WebDriver中的新标签上打开网站。我想这样做,因为使用PhantomJS为每个网站打开一个新的WebDriver需要大约3.5秒,我想要更快的速度......

我正在使用多进程python脚本,我想从每个页面获取一些元素,因此工作流程如下所示:

Open BrowserLoop throught my arrayFor element in array -> Open website in new tab -> do my business -> close it

但我找不到任何方法来实现这一目标。

这是我正在使用的代码。网站之间需要永远,我需要快速...其他工具是允许的,但我不知道有太多工具可以删除使用JavaScript加载的网站内容(在加载时触发某些事件时创建的div)这是为什么我需要Selenium ... BeautifulSoup不能用于我的一些页面。

#!/usr/bin/env pythonimport multiprocessing, time, pika, json, traceback, logging, sys, os, itertools, urllib, urllib2, cStringIO, mysql.connector, shutil, hashlib, socket, urllib2, refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom PIL import Imagefrom os import listdirfrom os.path import isfile, joinfrom bs4 import BeautifulSoupfrom pprint import pprintdef 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 errdef 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()
犯罪嫌疑人X
浏览 78回答 3
3回答

45度呼吸

您可以通过组合键COMMAND+ T或COMMAND+ W(OSX)来实现选项卡的打开/关闭。在其他操作系统上,您可以使用CONTROL+ T/ CONTROL+ W。在硒中你可以模仿这种行为。您将需要创建一个webdriver和多个选项卡作为您需要的测试。这是代码。from selenium import webdriverfrom selenium.webdriver.common.keys import Keysdriver = webdriver.Firefox()driver.get("http://www.google.com/")#open tabdriver.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()

繁星淼淼

这是从另一个示例改编的常见代码:from selenium import webdriverfrom selenium.webdriver.common.keys import Keysdriver = webdriver.Firefox()driver.get("http://www.google.com/")#open tab# ... take the code from the options below# Load a page&nbsp;driver.get('http://bings.com')# Make the tests...# close the tabdriver.quit()可能的方式是:发送<CTRL> + <T>到一个元素#open&nbsp;tabdriver.find_element_by_tag_name('body').send_keys(Keys.CONTROL&nbsp;+&nbsp;'t')<CTRL> + <T>通过Action链发送ActionChains(driver).key_down(Keys.CONTROL).send_keys('t').key_up(Keys.CONTROL).perform()执行一个javascript代码段driver.execute_script('''window.open("http://bings.com","_blank");''')为了实现这一点,您需要确保正确设置首选项browser.link.open_newwindow和browser.link.open_newwindow.restriction。最新版本中的默认值是可以的,否则您需要:fp&nbsp;=&nbsp;webdriver.FirefoxProfile()fp.set_preference("browser.link.open_newwindow",&nbsp;3)fp.set_preference("browser.link.open_newwindow.restriction",&nbsp;2)driver&nbsp;=&nbsp;webdriver.Firefox(browser_profile=fp)问题是那些偏好预设为其他值并且至少被&nbsp;冻结为硒3.4.0。当您使用配置文件使用java绑定设置它们时会出现异常,并且使用python绑定时会忽略新值。在Java中,有一种方法可以在与geckodriver交谈时设置这些首选项而无需指定配置文件对象,但它似乎尚未在python绑定中实现:FirefoxOptions&nbsp;options&nbsp;=&nbsp;new&nbsp;FirefoxOptions().setProfile(fp);options.addPreference("browser.link.open_newwindow",&nbsp;3);options.addPreference("browser.link.open_newwindow.restriction",&nbsp;2);FirefoxDriver&nbsp;driver&nbsp;=&nbsp;new&nbsp;FirefoxDriver(options);第三个选项在selenium 3.4.0中停止了python的工作。前两个选项似乎也停止在selenium 3.4.0中工作。它们依赖于将CTRL键事件发送到元素。乍一看似乎这是CTRL键的问题,但由于Firefox的新多进程功能,它失败了。可能这个新架构强加了新的方法,或者可能是一个临时的实现问题。无论如何我们可以通过以下方式禁用fp&nbsp;=&nbsp;webdriver.FirefoxProfile()fp.set_preference("browser.tabs.remote.autostart",&nbsp;False)fp.set_preference("browser.tabs.remote.autostart.1",&nbsp;False)fp.set_preference("browser.tabs.remote.autostart.2",&nbsp;False)driver&nbsp;=&nbsp;webdriver.Firefox(browser_profile=fp)...然后你可以成功使用第一种方式。

蝴蝶刀刀

browser.execute_script('''window.open("http://bings.com","_blank");''')当浏览器是的webdriver
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答