通过Python使用Selenium WebDriver打开Chrome扩展
我创建了一个Chrome扩展,它可以向数据库发起API请求,并获取与当前打开的网站相关的数据。例如,如果我打开target.com并点击这个扩展,它就会给我提供与target.com相关的数据。
我正在尝试通过Selenium WebDriver为这个扩展编写自动化测试,这样我就可以定期进行回归测试。为了测试这个扩展,我需要先打开它(通常我们是通过点击扩展图标来打开的)。
我尝试了不同的方法来点击扩展图标,但都没有成功。(比如,使用键盘快捷键ALT - 左箭头 - 空格,但这个方法在WebDriver中不起作用)。
我还尝试了这个方法(在这里提到的):
options = webdriver.ChromeOptions()
options.add_argument("--app-id = mbopgmdnpcbohhpnfglgohlbhfongabi")
但是上面的代码并不能帮助我打开扩展。
如果有人能告诉我如何在Selenium WebDriver中使用Python做到这一点,我将非常感激。
8 个回答
你可以使用这个方法来模拟点击扩展图标。
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.postMessage('clicked_browser_action', '*')");
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 WebDriver开发一个Chrome插件。正如‘@Aleksandar Popovic’所说,我们无法用WebDriver点击Chrome扩展图标,因为这个图标不在网页上。
我们使用了Sikuli(一个利用图像识别的自动化工具)来点击Chrome插件。点击后,插件的弹出窗口会变成另一个浏览器窗口,所以我们需要切换窗口来对插件的弹出窗口进行操作。
下面是一个使用Java的示例代码,结合了Selenium WebDriver和Sikuli。
Sikuli会根据图像识别来运行。在运行代码之前,需要截取Chrome浏览器的屏幕截图,并裁剪,只保留插件的部分。将这个图像保存为“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************************/
}
}
希望这对你有帮助。
我也遇到过同样的问题。为了绕过这个问题,我使用了这个链接:chrome-extension://<扩展的身份标识>/html/login.html
,而不是点击图标。这样,我就可以测试这个扩展的所有功能了。
Selenium 只能和网页的视图进行互动,所以这个事情做不到。
我找了很久想解决这个问题,结果发现根本没有办法。