web-dev-qa-db-ja.com

Chrome 69でchromedriverを介して実行するFlashコンテンツを許可する

Chrome 69でFlashプラグインを有効にする方法を知っている人はいますか。Java Seleniumバインディングでchromedriver 2.41を使用しています。私が試した

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でフラッシュをサポートして自動化を実行する方法はありますか?

6
doctordrue

回答ありがとうございます。

私はついに解決策を見つけました。 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);
2
doctordrue

フラグ--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");
3
Johno Crawford

@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")
2
majia29

Chrome 74のPython3バージョン。上記の@JohnoCrawfordのJavaバージョン。

from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import Select

def add_flash_site(driver, web_url):
    def expand_root_element(element):
        return driver.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")
2
BaiJiFeiLong

次の手順を実行します:

  1. 次のURLをChromeに入力します:chrome:// flags /
  2. 検索入力ボックスで、数字:はかないフラッシュ
  3. 「無効」オプションを選択します。

これは、Chrome 69。

2
Rodolpho Silva

ここで多くのメソッドが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リストで宣言します。テストされていませんが、http://*およびhttps://は、Flashリストを許可します。

1
Martian

最近リリースされたChrome 69では、サイト(URL)をchrome://settings/content/flash以前のバージョンのFlash Playerの場合と同様。ただし、ロケーションバーの左側にあるロックアイコンをクリックして、現在のセッションでURLを一時的に有効にしてから、Site Settingsを選択し、Flash Playerを有効にします。

このポリシーにより、Flash Playerのユーザーはセッションごとに許可設定を再構成する必要があり、Flash Playerを使用するのに利便性が低下します。これは明らかに設計によるものです。

幸いなことに、Microsoft Edgeブラウザーにはこのポリシーがありませんnot。 Chromeと同様に、EdgeはFlash Playerを実行します。ただし、Chromeとは異なり、アクセス許可の設定を保持し、ユーザーに不便をnotします。

1
CQ Bear

テストを実行する前にWebサイトの設定に入り、以下のようなSeleniumアクションを実行して、これを処理しました。

     public void SetFlashForURL (string yourWebsiteURL) {
 driver.Navigate().GoToUrl(string.Format("chrome://settings/content/siteDetails?site={0}", yourWebsiteURL));
                    Thread.Sleep(1000);
                    Actions actions = new Actions(driver);
                    if (yourWebsiteURL.Contains("https"))
                    {
                        actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                        actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                        actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                        actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                    }
                    actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                    actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                    actions.SendKeys(OpenQA.Selenium.Keys.Tab);
                    actions.SendKeys(OpenQA.Selenium.Keys.Down);
                    actions.Build().Perform(); 
    }
0
JeffH

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

他の誰かがそれを必要とする場合、分度器の設定で同じことをする方法は次のとおりです。

capabilities: {
  browserName: 'chrome',
  chromeOptions: {
    args: ['--disable-features=EnableEphemeralFlashPermission'],
    prefs: {
      "profile.content_settings.exceptions.plugins.*,*.per_resource.Adobe-flash-player": 1,
    }
  },
}
0
Nathan Friedly
    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
陈俊高

ロボットフレームワークを使用してChromedriverでフラッシュを有効にする

クレジット:@BaiJiFeiLong

次のコードをflash_helper.pyとして保存します

from robot.libraries.BuiltIn import BuiltIn
from Selenium.webdriver.common.by import By as WebBy
from Selenium.webdriver.support.ui import Select as WebSelect

def allow_flash(url):

  seleniumlib = BuiltIn().get_library_instance('SeleniumLibrary')
  driver = seleniumlib.driver

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

  driver.get("chrome://settings/content/siteDetails?site={}".format(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")

上記のメソッドをrobotframeworkのキーワードとして使用します

次のコードをtest.robotとして保存します

*** Settings ***
Library    SeleniumLibrary
Library    flash_helper.py

*** Test Case ***
Allow Flash In Chrome
    Open Browser    https://www.google.com    chrome

    # go to chrome settings and enable flash
    ${CURRENT_URL}    Get Location
    Allow Flash    ${CURRENT_URL}

    # revert to previous page
    Go To   ${CURRENT_URL}

   # now Flash is enabled in chrome!!

リンク付きの@RodolphoSilvaアンサーの使用:

1-入力リンク:chrome:// flags /#enable-ephemeral-flash-permission

2-「Disabled」に変更します

3-「RELAUNCH NOW」ボタンをクリックします

4-入力リンク:chrome:// settings/content/flash?search = flash

5-フラッシュを使用するサイトを追加またはブロックできます

@RodolphoSilva-すばらしい回答をありがとう!

0
Jorge Augusto