Разрешить Flash-контент в Chrome 69, запущенный через chromedriver - PullRequest
0 голосов
/ 05 сентября 2018

Кто-нибудь знает, как включить Flash-плагин в Chrome 69. Я использую chromedriver 2.41 с привязками селена Java. Я пробовал с

prefs.put("profile.default_content_setting_values.plugins", 1);
prefs.put("profile.content_settings.plugin_whitelist.adobe-flash-player", 1);
prefs.put("profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player", 1);

но без везения. Я также попытался сравнить настройки профиля Chrome с запрещенной / разрешенной флэш-памятью для определенного сайта, а затем попытался с помощью:

            Map<String, Object> site = new HashMap<>();
            Map<String, Object> values = new HashMap<>();
            Map<String, Object> setting = new HashMap<>();
            setting.put("flashPreviouslyChanged", true);
            values.put("last_modified", "13180613213099316");
            values.put("setting", setting);
            site.put("http://my.site,*", values);
            prefs.put("profile.content_settings.exceptions.flash_data", site);

но это не сработает.

Я также пытался запустить профиль, указанный с помощью

options.addArguments("user-data-dir=" + profileDir);

но поскольку этот параметр белого списка становится «эфемерным» в Chrome 69, он также не будет работать.

Есть ли способ запустить мою автоматизацию в Chrome с поддержкой флэш-памяти?

Ответы [ 12 ]

0 голосов
/ 17 мая 2019

Python3-версия для Chrome 74. Преобразована из Java-версии @JohnoCrawford выше.

def add_flash_site(drv, web_url):
    def expand_root_element(element):
        return drv.execute_script("return arguments[0].shadowRoot", element)

    driver.get("chrome://settings/content/siteDetails?site=" + web_url)
    root1 = driver.find_element(By.TAG_NAME, "settings-ui")
    shadow_root1 = expand_root_element(root1)
    root2 = shadow_root1.find_element(By.ID, "container")
    root3 = root2.find_element(By.ID, "main")
    shadow_root3 = expand_root_element(root3)
    root4 = shadow_root3.find_element(By.CLASS_NAME, "showing-subpage")
    shadow_root4 = expand_root_element(root4)
    root5 = shadow_root4.find_element(By.ID, "advancedPage")
    root6 = root5.find_element(By.TAG_NAME, "settings-privacy-page")
    shadow_root6 = expand_root_element(root6)
    root7 = shadow_root6.find_element(By.ID, "pages")
    root8 = root7.find_element(By.TAG_NAME, "settings-subpage")
    root9 = root8.find_element(By.TAG_NAME, "site-details")
    shadow_root9 = expand_root_element(root9)
    root10 = shadow_root9.find_element(By.ID, "plugins")
    shadow_root10 = expand_root_element(root10)
    root11 = shadow_root10.find_element(By.ID, "permission")
    Select(root11).select_by_value("allow")
0 голосов
/ 14 марта 2019

спасибо за @JohnoCrawford, я написал код на Python, ссылаясь на его код Java.

from urllib import quote_plus as url_quoteplus
from urlparse import urlsplit
from selenium.webdriver.common.by import By as WebBy
from selenium.webdriver.support.ui import Select as WebSelect

    def allow_flash(driver, url):
        def _base_url(url):
            if url.find("://")==-1:
                url = "http://{}".format(url)
            urls = urlsplit(url)
            return "{}://{}".format(urls.scheme, urls.netloc)

        def _shadow_root(driver, element):
            return driver.execute_script("return arguments[0].shadowRoot", element)

        base_url = _base_url(url)
        driver.get("chrome://settings/content/siteDetails?site={}".format(url_quoteplus(base_url)))

        root1 = driver.find_element(WebBy.TAG_NAME, "settings-ui")
        shadow_root1 = _shadow_root(driver, root1)
        root2 = shadow_root1.find_element(WebBy.ID, "container")
        root3 = root2.find_element(WebBy.ID, "main")
        shadow_root3 = _shadow_root(driver, root3)
        root4 = shadow_root3.find_element(WebBy.CLASS_NAME, "showing-subpage")
        shadow_root4 = _shadow_root(driver, root4)
        root5 = shadow_root4.find_element(WebBy.ID, "advancedPage")
        root6 = root5.find_element(WebBy.TAG_NAME, "settings-privacy-page")
        shadow_root6 = _shadow_root(driver, root6)
        root7 = shadow_root6.find_element(WebBy.ID, "pages")
        root8 = root7.find_element(WebBy.TAG_NAME, "settings-subpage")
        root9 = root8.find_element(WebBy.TAG_NAME, "site-details")
        shadow_root9 = _shadow_root(driver, root9)
        root10 = shadow_root9.find_element(WebBy.ID, "plugins")  # Flash
        shadow_root10 = _shadow_root(driver, root10)
        root11 = shadow_root10.find_element(WebBy.ID, "permission")
        WebSelect(root11).select_by_value("allow")
0 голосов
/ 27 марта 2019

Поскольку я видел, что многие методы здесь не работают для Chrome 71, я хотел бы поделиться решением в C #, которое я использую:

ChromeOptions chromeOptions = new ChromeOptions();
List<string> allowFlashUrls = new List<string>() {
    "*.testing1.com",
    "*.testing2.com",
};
chromeOptions.AddUserProfilePreference("profile.managed_plugins_allowed_for_urls", config.ChromeConfig.AllowFlashUrls);
ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
// Then run your test using chromeDriver

При установке profile.managed_plugins_allowed_for_urls Chrome принудительно разрешит запуск Flash в домене, объявленном в списке allowFlashUrls. Не тестировался, но он должен разрешить Flash всем сайтам, добавив http://* и https://, чтобы разрешить список Flash.

0 голосов
/ 01 ноября 2018
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--disable-features=EnableEphemeralFlashPermission");
    Map<String, Object> prefs = new HashMap<>();
    prefs.put("profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player",1);
    options.setExperimentalOption("prefs", prefs);
    WebDriver driver = new ChromeDriver(options);
    driver.get("some url");
0 голосов
/ 19 декабря 2018

Учитывая, что флаг --disable-features=EnableEphemeralFlashPermission был удален в Chrome 71, что серьезно подрывает автоматизацию тестирования Flash, я хотел бы поделиться нашим решением.

public class FlashPolicyHelper {

    private final ChromeDriver driver;

    public FlashPolicyHelper(ChromeDriver driver) {
        this.driver = driver;
    }

    public FlashPolicyHelper addSite(String site) {
        this.driver.get("chrome://settings/content/siteDetails?site=" + site);
        WebElement root1 = driver.findElement(By.tagName("settings-ui"));
        WebElement shadowRoot1 = expandRootElement(root1);
        WebElement root2 = shadowRoot1.findElement(getByIdentifier("id=container"));
        WebElement main = root2.findElement(getByIdentifier("id=main"));
        WebElement shadowRoot3 = expandRootElement(main);
        WebElement shadowRoot4 = shadowRoot3.findElement(getByIdentifier("class=showing-subpage"));
        WebElement shadowRoot5 = expandRootElement(shadowRoot4);
        WebElement shadowRoot6 = shadowRoot5.findElement(getByIdentifier("id=advancedPage"));
        WebElement shadowRoot7 = shadowRoot6.findElement(By.tagName("settings-privacy-page"));
        WebElement shadowRoot8 = expandRootElement(shadowRoot7);
        WebElement shadowRoot9 = shadowRoot8.findElement(getByIdentifier("id=pages"));
        WebElement shadowRoot10 = shadowRoot9.findElement(By.tagName("settings-subpage"));
        WebElement shadowRoot11 = shadowRoot10.findElement(By.tagName("site-details"));
        WebElement shadowRoot12 = expandRootElement(shadowRoot11);
        WebElement shadowRoot13 = shadowRoot12.findElement(By.id("plugins"));
        WebElement shadowRoot14 = expandRootElement(shadowRoot13);
        new Select(shadowRoot14.findElement(By.id("permission"))).selectByValue("allow");
        return this;
    }

    private By getByIdentifier(String identifier) {
        String[] identifiers = identifier.split("=");

        return identifiers[0].equals("id") ? By.id(identifiers[1]) :
                By.className(identifiers[1]);
    }

    private WebElement expandRootElement(WebElement element) {
        return (WebElement) driver.executeScript("return arguments[0].shadowRoot",element);
    }
}

Помощник должен быть вызван после создания экземпляра ChromeDriver.

 driver = new ChromeDriver(options);
 new FlashPolicyHelper(driver).addSite("https://your.site").addSite("https://another.site");
0 голосов
/ 21 сентября 2018

Используя @RodolphoSilva ответ со ссылками:

1 - Ссылка для ввода: chrome: // flags / # enable-ephemeral-flash-Разрешение

2 - Изменить на " Отключено "

3 - Нажмите кнопку " RELAUNCH NOW "

4 - Ссылка для ввода: chrome: // settings / content / flash? Search = flash

5 - Теперь вы можете добавлять или блокировать сайты для использования flash

@ RodolphoSilva - Большое спасибо за ваш отличный ответ!

0 голосов
/ 08 октября 2018

Если кому-то еще это нужно, вот как сделать то же самое в конфигурации Protractor:

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: ['--disable-features=EnableEphemeralFlashPermission'],
    prefs: {
      "profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player": 1,
    }
  },
}
0 голосов
/ 12 сентября 2018

Мое решение для C #

var chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--disable-features=EnableEphemeralFlashPermission");
chromeOptions.AddUserProfilePreference(
          "profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player", 1);
var capability = (DesiredCapabilities)chromeOptions.ToCapabilities();
0 голосов
/ 10 сентября 2018

Спасибо всем за ответы.

Я наконец нашел решение. Чтобы включить флэш-память программно с Chrome 69, нам нужно сделать 2 вещи:

  1. Отключить эфемерные Flash-разрешения (чтобы включить список разрешенных для Флэш сайты) и
  2. Добавить все сайты в этот список.

См. Следующий код на Java:

ChromeOptions options = new ChromeOptions();
// disable ephemeral flash permissions flag
options.addArguments("--disable-features=EnableEphemeralFlashPermission");
Map<String, Object> prefs = new HashMap<>();
// Enable flash for all sites for Chrome 69
prefs.put("profile.content_settings.exceptions.plugins.*,*.setting", 1);

options.setExperimentalOption("prefs", prefs);
nestedDriver = new ChromeDriver(options);
0 голосов
/ 08 сентября 2018

Выполните следующие действия:

  1. Введите этот URL в Chrome: chrome: // flags /
  2. В поле ввода поиска, цифра: эфемерная вспышка
  3. Выберите опцию «отключено».

При этом не требуется запускать Flash Player для дальнейших сеансов в Chrome 69.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...