Python - 如何在使用Selenium打开Chrome窗口后禁用扩展

时间:2017-07-27 02:54:53

标签: python google-chrome selenium xpath selenium-chromedriver

我正在尝试仅针对特定网站停用AdBlock,但我找不到办法。我尝试查看selenium documentation,但我找不到任何方法来禁用扩展。但是,我在阅读文档时仍然很陌生,所以我可能错过了一些东西。我还尝试使用selenium自动禁用AdBlock扩展,但它不起作用。计划是转到chrome(chrome:// extensions /)的扩展部分,获取“启用”复选框并单击它而不需要我的干预。这是我的尝试:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import StaleElementReferenceException

def main():
        opening = True
        while opening:
                try:
                        chrome_options = Options()
                        #Path to AdBlock
                        chrome_options.add_extension('/usr/local/bin/AdBlock_v.crx')
                        driver = webdriver.Chrome(chrome_options=chrome_options)
                except:
                        print('An unkown error has occured. Trying again...')
                else:
                        opening = False          

        disable_adblocker(driver)


def click_element(driver, xpath, index):
        getting = True
        not_found_times = 0
        while getting:
                try:
                        getting = False              
                        element = WebDriverWait(driver, 5).until(
                            EC.presence_of_all_elements_located((By.XPATH,xpath)))[index]
                        element.click()
            #driver.get(element.get_attribute("href"))


            #In case the page does not load properly  
                except TimeoutException:
                        not_found_times += 1
                        if not_found_times < 2:
                                driver.refresh()
                                getting = True
                        else:
                                raise

            #In case DOM updates which makes elements stale
                except StaleElementReferenceException: 
                        getting = True


def disable_adblocker(driver):
        driver.get('chrome://extensions')
        ad_blocker_xpath = '//div[@id="gighmmpiobklfepjocnamgkkbiglidom"]//div[@class="enable-controls"]//input'
        click_element(driver,ad_blocker_xpath,0)
        print('')


main()

我的尝试失败的原因是因为selenium无法使用我指定的xpath来获取checkbox元素。我相信道路是正确的。

我能想到的唯一解决方案是创建两个镀铬窗口:一个使用AdBlock,另一个不使用AdBlock。但是,我不想要两个窗口,因为这会使事情变得更复杂。

1 个答案:

答案 0 :(得分:1)

使用selenium中的任何设置看起来都不可能。但是......您可以在创建驱动程序后自动添加要排除的域。

在您的测试实际开始之前,但在您初始化浏览器之后,请导航至chrome-extension:// [您的AdBlock扩展ID] /options.html。 AdBlock扩展ID对于crx文件是唯一的。所以进入chrome并在扩展管理器中找到值。例如,我的是gighmmpiobklfepjocnamgkkbiglidom。

在您导航到该页面后,点击“自定义”,然后“除了这些域以外的所有地方展示广告...”,然后将域名输入到字段,然后点击“确定”。繁荣!现在,域名已添加并将显示广告!只需确保

我知道它不是理想的快速,简单,一行代码解决方案......但它似乎是最好的选择,除非您想要挖掘本地存储文件并找到这些数据的添加位置。