MT#57776 update dockerfile to make python tests work on debian 12

update browsers, selenium & dependencies and updated tests to
accomondate new syntax thats been a requirement since selenium 4.7

Change-Id: I6bae13b7ba109b69b1fb9c59e3c6a1449c529fb8
mr12.0
Nico Schedel 2 years ago
parent c2fe092004
commit a2270e19b8

2
.gitignore vendored

@ -45,3 +45,5 @@ api-rest.pretty
nytprof
.tags
.remote-sync.json
__pycache__
core

@ -5,7 +5,7 @@ FROM docker.mgm.sipwise.com/sipwise-bookworm:latest
# is updated with the current date. It will force refresh of all
# of the base images and things like `apt-get update` won't be using
# old cached versions when the Dockerfile is built.
ENV REFRESHED_AT 2023-06-26
ENV REFRESHED_AT 2023-07-05
RUN apt-get update
RUN apt-get install --assume-yes \
@ -20,7 +20,9 @@ RUN apt-get install --assume-yes \
net-tools \
procps \
python3 \
python3-pip \
python3-coverage \
python3-nose2 \
python3-selenium \
tigervnc-standalone-server \
unzip \
vim-tiny \
@ -31,44 +33,35 @@ RUN adduser --disabled-password --gecos=Selenium-User selenium
WORKDIR /home/selenium/
# installing geckodriver (0.29.1)
RUN wget http://deb.sipwise.com/files/geckodriver-v0.29.1-linux64.tar.gz && \
tar xvf geckodriver-v0.29.1-linux64.tar.gz && \
# installing geckodriver (0.33.0)
RUN wget http://deb.sipwise.com/files/geckodriver-v0.33.0-linux64.tar.gz && \
tar xvf geckodriver-v0.33.0-linux64.tar.gz && \
ln -s /home/selenium/geckodriver /usr/bin/geckodriver && \
rm -f geckodriver-v0.29.1-linux64.tar.gz
rm -f geckodriver-v0.33.0-linux64.tar.gz
# installing firefox (lang=en_US) (88.0.1)
RUN wget http://deb.sipwise.com/files/firefox-88.0.1.tar.bz2 && \
tar xvf firefox-88.0.1.tar.bz2 && \
# installing firefox (lang=en_US) (114.0.2)
RUN wget http://deb.sipwise.com/files/firefox-114.0.2.tar.bz2 && \
tar xvf firefox-114.0.2.tar.bz2 && \
ln -s /home/selenium/firefox/firefox /usr/bin/firefox && \
rm -f firefox-88.0.1.tar.bz2
rm -f firefox-114.0.2.tar.bz2
# installing chromedriver (91.0.4472.19)
RUN wget http://deb.sipwise.com/files/chromedriver_linux64.zip && \
unzip chromedriver_linux64.zip && \
ln -s /home/selenium/chromedriver /usr/bin/chromedriver && \
rm -f chromedriver_linux64.zip
# installing chromedriver (114.0.5735.90)
RUN wget http://deb.sipwise.com/files/chromedriver_linux64_114.zip && \
unzip chromedriver_linux64_114.zip && \
#ln -s /home/selenium/chromedriver /usr/bin/chromedriver && \
rm -f chromedriver_linux64114.zip
# installing chrome (91.0.4472.77)
RUN wget http://deb.sipwise.com/files/google-chrome-stable_current_amd64.deb && \
apt install -y ./google-chrome-stable_current_amd64.deb && \
rm -f google-chrome-stable_current_amd64.deb
# installing nose2 (0.10.0), coverage (5.5) and selenium (3.141.0) via pip
# considering to package latest version of python3-nose2/selenium/coverage as .deb package
# installing coverage first to satisfy dependency for nose2
RUN wget http://deb.sipwise.com/files/nose2-0.10.0.tar.gz && \
wget http://deb.sipwise.com/files/selenium-3.141.0.tar.gz && \
wget http://deb.sipwise.com/files/coverage-5.5.tar.gz && \
pip3 install --break-system-packages coverage-5.5.tar.gz && \
pip3 install --break-system-packages nose2-0.10.0.tar.gz selenium-3.141.0.tar.gz && \
rm -f nose2-0.10.0.tar.gz selenium-3.141.0.tar.gz coverage-5.5.tar.gz
# installing chrome (114.0.5735.198)
RUN wget http://deb.sipwise.com/files/google-chrome-stable_114_amd64.deb && \
apt install -y ./google-chrome-stable_114_amd64.deb && \
rm -f google-chrome-stable_114_amd64.deb
RUN echo "cd /code && ./t/selenium/testrunner 1.2.3.4 /code/ tap" >/home/selenium/.bash_history
RUN echo "su - selenium" >/root/.bash_history
EXPOSE 5999
COPY t/selenium/jenkins_docker_run /home/selenium/
COPY t/selenium/webdriver_prefs.json /usr/lib/python3/dist-packages/selenium/webdriver/firefox/
################################################################################
# Instructions for usage

@ -14,7 +14,7 @@ def login_panel(driver, username="administrator", password="administrator"):
driver.get(os.environ['CATALYST_SERVER'] + ":1443")
try:
driver.implicitly_wait(1)
driver.find_element_by_xpath('//*[@id="login_page_v1"]//div/b/a').click()
driver.find_element(By.XPATH, '//*[@id="login_page_v1"]//div/b/a').click()
driver.implicitly_wait(10)
except:
pass
@ -25,47 +25,47 @@ def login_panel(driver, username="administrator", password="administrator"):
fill_element(driver, '//*[@aria-label="Password"]', password)
click_js(driver, '//*[@id="q-app"]/div//main/div/form//button[contains(., "Sign In")]')
driver.implicitly_wait(2)
if len(driver.find_elements_by_xpath('//*[@id="footer"]//div//b/a[contains(., "GO TO NEW ADMIN PANEL")]')) > 0:
driver.find_element_by_xpath('//*[@id="footer"]//div//b/a[contains(., "GO TO NEW ADMIN PANEL")]').click()
if len(driver.find_elements(By.XPATH, '//*[@id="footer"]//div//b/a[contains(., "GO TO NEW ADMIN PANEL")]')) > 0:
driver.find_element(By.XPATH, '//*[@id="footer"]//div//b/a[contains(., "GO TO NEW ADMIN PANEL")]').click()
driver.implicitly_wait(10)
def logout_panel(driver):
driver.find_element_by_xpath('//*[@id="q-app"]//div/button[@aria-label="UserMenu"]').click()
driver.find_element_by_xpath('/html/body//div[@class="q-list"]/div[2]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div/button[@aria-label="UserMenu"]').click()
driver.find_element(By.XPATH, '/html/body//div[@class="q-list"]/div[2]').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="login-title"]')))
def create_reseller(driver, resellername, contractname):
print("Go to 'Reseller'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]').click()
print("OK")
print("Try to create a new Reseller...", end="")
driver.find_element_by_xpath('//*[@id="q-app"]/div//main//div/a[contains(., "Add")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div//main//div/a[contains(., "Add")]').click()
fill_element(driver, '//*[@id="q-app"]/div//main/form/div//label//div[contains(., "Contract")]/../div/input', contractname)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body//div/div[@class="q-virtual-scroll__content"]/div[1]')))
driver.find_element_by_xpath('/html/body//div/div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element(By.XPATH, '/html/body//div/div[@class="q-virtual-scroll__content"]/div[1]').click()
fill_element(driver, '//*[@id="q-app"]/div//main/form/div//label//div[contains(., "Name")]/../div/input', resellername)
driver.find_element_by_xpath('//*[@id="q-app"]//div//main//div/button[contains(., "Save")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//main//div/button[contains(., "Save")]').click()
print("OK")
def delete_reseller(driver, reseller):
print("Go to 'Reseller'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Resellers")]').click()
print("OK")
print("Try to delete Reseller...", end="")
wait_for_invisibility(driver, '/html/body//div/main//div/label//div/input[contains(@class, "q-field--disabled")]')
fill_element(driver, '/html/body//div/main//div/label//div/input', reseller)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[contains(., "' + reseller + '")]')))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button')))
driver.find_element_by_xpath('//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div/div')))
driver.find_element_by_xpath('/html/body/div[4]/div/div').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div/div').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]')))
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
wait_for_invisibility(driver, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]')
print("OK")
@ -73,27 +73,27 @@ def delete_reseller(driver, reseller):
def create_reseller_contract(driver, contractname):
print("Go to 'Contracts'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]').click()
print("OK")
print("Try to create a new Reseller Contract...", end="")
wait_for_invisibility(driver, '/html/body//div/main//div/label//div/input[contains(@class, "q-field--disabled")]')
driver.find_element_by_xpath('//*[@id="q-app"]/div//main//div/button[contains(., "Add")]').click()
driver.find_element_by_xpath('//*[@data-cy="aui-list-action-menu-item--contract-create-reseller"]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div//main//div/button[contains(., "Add")]').click()
driver.find_element(By.XPATH, '//*[@data-cy="aui-list-action-menu-item--contract-create-reseller"]').click()
fill_element(driver, '//*[@id="q-app"]/div//main/form/div//label//div[contains(., "Contact")]/../div/input', "default")
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div//div[@class="q-virtual-scroll__content"]/div[1]')))
time.sleep(1)
driver.find_element_by_xpath('/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element(By.XPATH, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
wait_for_invisibility(driver, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]')
driver.find_element_by_xpath('//*[@id="q-app"]//div//main/form//div//label[contains(., "Status")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//main/form//div//label[contains(., "Status")]').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div//div[@class="q-virtual-scroll__content"]/div[1]')))
time.sleep(1)
driver.find_element_by_xpath('/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element(By.XPATH, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
fill_element(driver, '//*[@id="q-app"]/div//main/form/div//label//div[contains(., "External")]/../div/input', contractname)
driver.find_element_by_xpath('//*[@id="q-app"]//div//main/form//div//label[contains(., "Billing Profile")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//main/form//div//label[contains(., "Billing Profile")]').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div//div[@class="q-virtual-scroll__content"]/div[1]')))
time.sleep(1)
driver.find_element_by_xpath('/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element_by_xpath('//*[@id="q-app"]/div//main//div/button[contains(., "Save")]').click()
driver.find_element(By.XPATH, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div//main//div/button[contains(., "Save")]').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body//div[@role="alert"][contains(., "Contract created successfully")]')))
print("OK")
@ -101,18 +101,18 @@ def create_reseller_contract(driver, contractname):
def delete_reseller_contract(driver, contract):
print("Go to 'Contracts'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Contracts")]').click()
print("OK")
print("Try to delete Reseller Contract...", end="")
wait_for_invisibility(driver, '/html/body//div/main//div/label//div/input[contains(@class, "q-field--disabled")]')
fill_element(driver, '/html/body//div/main//div/label//div/input', contract)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr/td[contains(., "' + contract + '")]')))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button')))
driver.find_element_by_xpath('//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div/div')))
driver.find_element_by_xpath('/html/body/div[4]/div/div').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div/div').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]')))
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
wait_for_invisibility(driver, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]')
print("OK")
@ -120,23 +120,23 @@ def delete_reseller_contract(driver, contract):
def create_billing_profile(driver, billingname, billingrealname, reseller):
print("Go to 'Billing Profiles'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]').click()
print("OK")
print("Try to create a new Billing Profile...", end="")
driver.find_element_by_xpath('//*[@id="q-app"]/div/div[2]/main/div/div[2]/div[1]/div[1]/a').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div/div[2]/div[1]/div[1]/a').click()
fill_element(driver, '//*[@id="q-app"]/div/div[2]/main/form/div/div[1]/div/div[1]/div/div/div[1]/label/div[1]/div[1]/div[2]/div[1]/input', reseller)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body//div/div[@class="q-virtual-scroll__content"]/div[1]')))
driver.find_element_by_xpath('/html/body/div//div[@class="q-virtual-scroll__content"]/div[1]').click()
driver.find_element(By.XPATH, '/html/body/div//div[@class="q-virtual-scroll__content"]/div[1]').click()
fill_element(driver, '//*[@id="q-app"]/div/div[2]/main/form/div/div[1]/div/div[2]/div/label/div/div[1]/div/input', billingname)
fill_element(driver, '//*[@id="q-app"]/div/div[2]/main/form/div/div[1]/div/div[3]/div/label/div/div[1]/div[1]/input', billingrealname)
driver.find_element_by_xpath('//*[@id="q-app"]/div/div[2]/main/div/div[2]/button').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div/div[2]/button').click()
print("OK")
def delete_billing_profile(driver, billingrealname):
print("Go to 'Billing Profiles'...", end="")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]')))
driver.find_element_by_xpath('//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]//div//aside//div//a[contains(., "Billing Profile")]').click()
print("OK")
print("Try to delete Billing Profile...", end="")
wait_for_invisibility(driver, '/html/body//div/main//div/label//div/input[contains(@class, "q-field--disabled")]')
@ -144,10 +144,10 @@ def delete_billing_profile(driver, billingrealname):
fill_element(driver, '/html/body//div/main//div/label//div/input', billingrealname)
wait_for_invisibility(driver, '//*[@id="q-app"]/div//main//div/table/thead/tr[2]/th/div[@role="progressbar"]')
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button')))
driver.find_element_by_xpath('//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
driver.find_element(By.XPATH, '//*[@id="q-app"]/div/div[2]/main/div[1]/div/div[1]/table/tbody/tr[1]/td[2]/button').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div/div[2]')))
driver.find_element_by_xpath('/html/body/div[4]/div/div[2]').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div/div[2]').click()
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]')))
driver.find_element_by_xpath('/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
driver.find_element(By.XPATH, '/html/body/div[4]/div[2]/div/div[3]/button[2]').click()
wait_for_invisibility(driver, '/html/body//div[@class="q-virtual-scroll__content"]/div[1]')
print("OK")

@ -15,7 +15,7 @@ def fill_element(driver, element, text, pathtype=By.XPATH):
def scroll_to_element(driver, element):
if element[:1] == "/":
webelem = driver.find_element_by_xpath(element)
webelem = driver.find_element(By.XPATH, element)
else:
webelem = driver.find_element_by_link_text(element)
driver.execute_script("arguments[0].scrollIntoView();", webelem)
@ -23,7 +23,7 @@ def scroll_to_element(driver, element):
def click_js(driver, element):
if element[:1] == "/":
webelement = driver.find_element_by_xpath(element)
webelement = driver.find_element(By.XPATH, element)
else:
webelement = driver.find_element_by_link_text(element)
driver.execute_script("arguments[0].click();", webelement)

File diff suppressed because it is too large Load Diff

@ -0,0 +1,69 @@
{
"frozen": {
"app.update.auto": false,
"app.update.enabled": false,
"browser.displayedE10SNotice": 4,
"browser.download.manager.showWhenStarting": false,
"browser.EULA.override": true,
"browser.EULA.3.accepted": true,
"browser.link.open_external": 2,
"browser.link.open_newwindow": 2,
"browser.offline": false,
"browser.reader.detectedFirstArticle": true,
"browser.safebrowsing.enabled": false,
"browser.safebrowsing.malware.enabled": false,
"browser.search.update": false,
"browser.selfsupport.url" : "",
"browser.sessionstore.resume_from_crash": false,
"browser.shell.checkDefaultBrowser": false,
"browser.tabs.warnOnClose": false,
"browser.tabs.warnOnOpen": false,
"datareporting.healthreport.service.enabled": false,
"datareporting.healthreport.uploadEnabled": false,
"datareporting.healthreport.service.firstRun": false,
"datareporting.healthreport.logging.consoleEnabled": false,
"datareporting.policy.dataSubmissionEnabled": false,
"datareporting.policy.dataSubmissionPolicyAccepted": false,
"devtools.errorconsole.enabled": true,
"dom.disable_open_during_load": false,
"extensions.autoDisableScopes": 10,
"extensions.blocklist.enabled": false,
"extensions.checkCompatibility.nightly": false,
"extensions.update.enabled": false,
"extensions.update.notifyUser": false,
"javascript.enabled": true,
"network.manage-offline-status": false,
"network.http.phishy-userpass-length": 255,
"offline-apps.allow_by_default": true,
"prompts.tab_modal.enabled": false,
"security.fileuri.origin_policy": 3,
"security.fileuri.strict_origin_policy": false,
"signon.rememberSignons": false,
"toolkit.networkmanager.disable": true,
"toolkit.telemetry.prompted": 2,
"toolkit.telemetry.enabled": false,
"toolkit.telemetry.rejected": true,
"xpinstall.signatures.required": false,
"xpinstall.whitelist.required": false
},
"mutable": {
"browser.dom.window.dump.enabled": true,
"browser.laterrun.enabled": false,
"browser.newtab.url": "about:blank",
"browser.newtabpage.enabled": false,
"browser.startup.page": 0,
"browser.startup.homepage": "about:blank",
"browser.startup.homepage_override.mstone": "ignore",
"browser.usedOnWindows10.introURL": "about:blank",
"dom.max_chrome_script_run_time": 30,
"dom.max_script_run_time": 30,
"dom.report_all_js_exceptions": true,
"javascript.options.showInConsole": true,
"network.captive-portal-service.enabled": false,
"security.csp.enable": false,
"startup.homepage_welcome_url": "about:blank",
"startup.homepage_welcome_url.additional": "about:blank",
"webdriver_accept_untrusted_certs": true,
"webdriver_assume_untrusted_issuer": true
}
}
Loading…
Cancel
Save