使用Python通过Selenium WebDriver打开chrome扩展

时间:2014-08-28 20:33:08

标签: python google-chrome selenium google-chrome-extension selenium-webdriver

我创建了一个chrome扩展,它对数据库进行API调用,并获取与当前打开的网站相关的一些数据。例如,如果我打开target.com并点击扩展名,它将为您提供与target.com相关的数据。

我正在尝试通过selenium web驱动程序为它编写自动化测试,我可以定期运行它来进行回归测试。要测试扩展,我需要先打开扩展(通常我们通过单击扩展图标来完成)。

我尝试过尝试点击扩展程序图标但尝试不成功的不同方法。 (例如,使用键盘快捷键ALT - LEFT_ARROW - SPACE但无法通过webdriver工作)。

我也试过这个(提到here):

options = webdriver.ChromeOptions()
options.add_argument("--app-id = mbopgmdnpcbohhpnfglgohlbhfongabi")

但是上面的代码没有帮助打开扩展程序。

对于如何在Selenium Webdriver中使用python我能做到这一点,我将不胜感激。

9 个答案:

答案 0 :(得分:4)

我们有类似的要求,使用Selenium WebDriver处理chrome附加组件。正如'@Aleksandar Popovic'所说,我们无法使用WebDriver点击chrome扩展图标,因为图标不在网页中。

我们使用sikuli(使用图像识别的自动化工具)来点击Chrome附加组件。之后,附加弹出窗口将成为另一个浏览器窗口,因此请使用切换窗口对附加组件弹出窗口执行操作。

以下是使用 Selenium Webdriver Sikuli Java 中的示例代码。

Sikuli将基于图像识别运行。在运行代码之前,Chrome浏览器的屏幕截图并将其裁剪,以便图像中只有Addon可用。将该图像另存为“AddonIcon.png”。

Sikuli将在屏幕上匹配该图像(在我们的例子中为AddonIcon.png)并模拟其上的点击操作。

import java.io.File;
import java.util.List;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.sikuli.script.App;
import org.sikuli.script.FindFailed;
import org.sikuli.script.Pattern;
import org.sikuli.script.Screen;
public class PageTest {

    public static void main(String[] args) {
        // Opening chrome with that addon
        ChromeOptions options = new ChromeOptions();
        options.addExtensions(new File("Path to ur chrome addon (.cxt file)"));     
        System.setProperty("webdriver.chrome.driver", "path to chromedriver.exe");
        WebDriver driver = new ChromeDriver(options);
        driver.manage().window().maximize();

        // Creating object to the Sukali screen class
        Screen s=new Screen();

        //Finding and clicking on the Addon image
         try {
            s.find("Path to the 'AddonIcon.png'");
            s.click("Path to the 'AddonIcon.png'");
        } catch (FindFailed e) {            
            e.printStackTrace();
        }

        //Wait until new Addon popup is opened.
         WebDriverWait wait = new WebDriverWait(driver, 5);      
         wait.until(ExpectedConditions.numberOfWindowsToBe(2));

         // Switch to the Addon Pop up
         String parentWindow= driver.getWindowHandle();
         Set<String> allWindows = driver.getWindowHandles();
         for(String curWindow : allWindows){             
             if(!parentWindow.equals(curWindow)){
             driver.switchTo().window(curWindow);
             }
         }

         /***********Ur code to work on Add-on popup************************/
    }
}

我希望这会对你有所帮助。

答案 1 :(得分:3)

有同样的问题。通过使用链接function getCurrentUser() { if (currentUser) { return $q.when(currentUser); } var resp = getCurrentUserFromAPI().then(function(response) { if (response.data) { currentUser = response.data; return currentUser; } else { currentUser = null; throw null; } }, function(error) { var token = authTokenService.getToken(); if (token) { authTokenService.deleteToken(); } throw error; }); if(resp.$$state.status == 0) { $location.path('/signin') } return resp; }; function getCurrentUserFromAPI() { return $http.get(api_config.BASE_URL + '/getCurrentLoggedUser'); } - 而不是图标来解决它。 这样,我可以测试扩展的所有功能。

答案 2 :(得分:2)

Selenium仅支持与网络视图的互动 - 所以这是不可能的。

我一直在寻找这个问题的解决方案 - 事实证明没有。

https://code.google.com/p/selenium/issues/detail?id=7805

http://grokbase.com/t/gg/selenium-developer-activity/148xndmkna/issue-7805-in-selenium-clicking-on-chrome-extension-to-open-popup

答案 3 :(得分:1)

from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_extension("./testCRX/angular_ext.crx")
driver = webdriver.Chrome(chrome_options=option)
driver.get('chrome://extensions/')

打开添加的扩展程序:我认为我们可以在chrome:// extensions / - &gt;中设置快捷键键盘快捷键,将键盘快捷键添加到添加的扩展名,然后发送键盘以启动扩展名。

答案 4 :(得分:0)

我知道它不完全一样,但是你不能用你的弹出窗口将iframe注入到页面中,然后与它进行交互以进行测试吗?

<iframe src='chrome-extension://<extensionId>/popup.html'/>

答案 5 :(得分:0)

您必须使用台式机 UI testing解决方案来自动执行Chrome扩展程序。像Selenium这样的纯Web测试解决方案不能不能自动化浏览器插件,因为它无法访问它们。

  • Sikul是自动化的不错选择。如果您添加Tesseract,则可以进行屏幕抓取。

  • UI.Vision是另一个很好的工具,它包含内置的screen scraping(如果您需要从UI中获取文本)。它直接在网络浏览器中运行,有关如何automate a Chrome extension使用它,请参见此论坛帖子。

答案 6 :(得分:0)

您可以使用此解决方案来模拟扩展图标上的点击

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.postMessage('clicked_browser_action', '*')");

答案 7 :(得分:-3)

试试这个:Running Selenium WebDriver using Python with extensions (.crx files)

使用

options.add_extension( 'path_to_extension.crx')

答案 8 :(得分:-3)

您可以通过路径指向解压缩扩展程序的选项将参数--load-extension传递给Chrome网络驱动程序。因此,在您的情况下,您可以使用:options.add_argument("--load-extension=ABSOLUTE_PATH_TO_EXTENSION")

此外,here is指向我使用--load-extension方法编写的某些代码的链接。 (这不是Ruby而是Python,但应该给你一些见解。)