selenium - 使用 selenium webdriver 访问和处理 chrome 扩展弹出窗口
问题描述
我正在尝试使用 Selenium webdriver 安装 IBM DAP chrome 扩展。我无权访问 crx 文件。因此,我尝试通过 chrome 网上商店直接安装插件,如下所示:
browser = webdriver.Chrome()
browser.get('https://chrome.google.com/webstore/detail/dynamic-assessment-plugin/fnapgcgphlfhecijolobjodbbnjjpdga')
browser.maximize_window()
browser.implicitly_wait(5)
browser.find_element_by_css_selector("body > div.F-ia-k.S-ph.S-pb-qa > div.h-F-f-k.F-f-k > div > div > div.e-f-o > div.h-e-f-Ra-c.e-f-oh-Md-zb-k > div > div").click()
browser.switch_to_alert().accept()
但是此代码无法访问弹出窗口,并且无法单击“添加扩展名”按钮。如何访问弹出窗口并单击“添加扩展”?
解决方案
这不是 javascipt 警报。它无法使用 Selenium Alert 处理。它是一个类似于文件上传窗口的原生操作系统相关窗口。
在 Java 中,我们可以使用 Robot 类来模拟 keyevent 来处理这个问题。
如果是 windows os ,我们可以使用 AutoIt 脚本来处理弹窗。请参阅此相关帖子以了解 auto it 用法。这是一个exe文件,可以用任何语言执行。
我已经尝试使用 Robot 类在 java 中使用它,它对我有用。
import io.github.bonigarcia.wdm.ChromeDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class InstallChromeExtention {
public static void main(String[] args) throws IOException, AWTException, InterruptedException {
ChromeDriverManager.getInstance().setup();
WebDriver driver = new ChromeDriver();
driver.get("https://chrome.google.com/webstore/detail/google-keep-chrome-extens/lpcaedmchfhocbbapmcbpinfpgnhiddi");
WebDriverWait wait = new WebDriverWait(driver, 60);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("[aria-label='Add to Chrome']")));
element.click();
Thread.sleep(5000);
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
Thread.sleep(500);
robot.keyPress(KeyEvent.VK_ENTER);
Thread.sleep(500);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("[aria-label='Remove from Chrome']")));
}
}
推荐阅读
- r - 在设定的时间段内选择具有最早时间值的数据框行
- performance - 将镶木地板文件与 Spark 合并
- wpf - WPF Xaml Islands - UWP 地图控制像素化折线
- linux - 用映射中的值替换第一个字段
- artifactory - 在其文件夹中获取具有自定义属性的工件
- python - 如何从弹性搜索中查询数据,但只能从热门索引中查询
- typescript - 返回从使用 Typescript 传递的泛型参数推断的排序内部类型
- c++ - std::bind 和/或 std::forward 的语义
- c++ - OpenCV FAST 操作。为什么使用 FAST 而不是 FastFeatureDetector
- cockpit - 在哪里可以找到知识驾驶舱?