【问题标题】:Open a chrome extension through Selenium WebDriver using Python使用 Python 通过 Selenium WebDriver 打开一个 chrome 扩展
【发布时间】:2014-10-22 19:57:06
【问题描述】:

我创建了一个 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 执行此操作的任何想法,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我知道这不完全一样,但您不能将 iframe 与弹出窗口的源代码一起注入页面,然后与之交互以进行测试吗?

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

      【讨论】:

        【解决方案3】:
        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/ -> 键盘快捷键中设置快捷键,将键盘快捷键添加到您添加的扩展中,然后发送键盘以启动扩展。

        【讨论】:

        • 你能证明这是可行的吗?我可以看到这可能会让您看到“弹出窗口”出现 - 但是 Selenium 实际上可以访问其中显示的 HTML 页面并使其自动化吗?
        【解决方案4】:

        我们有类似的要求,使用 Selenium WebDriver 开发 chrome 插件。正如“@Aleksandar Popovic”所说,我们无法使用 WebDriver 单击 chrome 扩展图标,因为图标不在网页中。

        我们使用sikuli(利用图像识别的自动化工具)来点击chrome插件。加载项弹出后将是另一个浏览器窗口,因此请使用切换窗口对加载项弹出执行操作。

        这里是 Java 中使用 Selenium WebdriverSikuli 的示例代码。

        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************************/
            }
        }
        

        希望对你有所帮助。

        【讨论】:

          【解决方案5】:

          Selenium 仅支持与 Web 视图的交互 - 所以这是不可能的。

          我一直在寻找这个问题的解决方案 - 结果没有。

          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

          【讨论】:

            【解决方案6】:

            遇到了同样的问题。通过使用链接解决它:chrome-extension://&lt;the extension identity&gt;/html/login.html - 而不是图标。 这样,我就可以测试扩展的所有功能了。

            【讨论】:

            • 虽然是真的,但行为与在弹出窗口中打开有点不同。
            • 可以试试 subprocess.call 和 applescripts 吗?
            • @KathyChow 你能提供更多细节吗?我必须在单击 Chrome 扩展按钮时加载一个弹出窗口
            • @Volatil3 是的,我还可以在单​​击 Chrome 扩展按钮时加载一个弹出窗口。但有时,使用链接:chrome-extension:///html 非常有用。
            • 我认为大多数扩展都与当前活动选项卡交互 - 在这种情况下这并没有真正帮助,因为大概扩展也成为活动选项卡?
            【解决方案7】:

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

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

            【讨论】:

            • 我已经能够使用 chrome_options.add_argument("--load-extension=ABSOLUTE_PATH_TO_UNPACKED_EXTENSION"); 加载 chrome 扩展,但我的问题是我无法从 webdriver 点击扩展(即打开扩展)
            【解决方案8】:

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

            使用

            options.add_extension('path_to_extension.crx')

            【讨论】:

            • 问题是点击扩展图标,没有加载带有扩展选项的浏览器。
            猜你喜欢
            • 2018-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-12
            • 2015-08-09
            • 2018-01-04
            • 1970-01-01
            相关资源
            最近更新 更多