chromeとseleniumgridを使用したfirefoxの両方のテストを設定しています。以下のようにdockerイメージSelenium-hubとSelenium node-chromeとnode-firefoxを使用しています。
app:
build: .
command: gunicorn --reload --capture-output --log-level debug --access-logfile - -w 3 -b 0.0.0.0 app.wsgi
restart: always
volumes_from:
- initialize
ports:
- "8000:8000"
links:
- db
- rabbitmq
- Selenium_hub
env_file: secrets.env
volumes:
- ./app/:/code/
Selenium_hub:
image: Selenium/hub
ports:
- 4444:4444
expose:
- 4444
tty: true
environment:
- GRID_MAX_SESSION=20
- GRID_NEW_SESSION_WAIT_TIMEOUT=60000
- GRID_BROWSER_TIMEOUT=300
- GRID_TIMEOUT=300
- TIMEOUT=300
node_1:
image: Selenium/node-chrome
depends_on:
- Selenium_hub
environment:
- HUB_Host=Selenium_hub
- HUB_PORT=4444
- NODE_MAX_SESSION=3
- NODE_MAX_INSTANCES=2
shm_size: 2GB
node_2:
image: Selenium/node-firefox
environment:
- HUB_Host=Selenium_hub
- HUB_PORT=4444
- NODE_MAX_SESSION=3
- NODE_MAX_INSTANCES=2
shm_size: 2GB
depends_on:
- Selenium_hub
テストを実行しようとすると、常にこのエラーInvalidCookieDomainException: Message: invalid cookie domain
が発生します。すでにドメインをself.live_server_url
に設定しています。以下は、テスト設定での完全なトレースバックです。
Traceback (most recent call last):
File "/code/frontend/tests/test_user_auth.py", line 75, in setUp
"port": "8082",
File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/webdriver.py", line 894, in add_cookie
self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.5/site-packages/Selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
Selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
(Session info: chrome=77.0.3865.75)
テスト リファレンスチュートリアル 。
class TestUserCreate(StaticLiveServerTestCase):
fixtures = ["test.json"]
port = 8082
@classmethod
def setUpClass(cls):
super().setUpClass()
caps = {
"browserName": os.getenv("BROWSER", "chrome"),
"javascriptEnabled": True,
}
cls.driver = webdriver.Remote(
command_executor="http://Selenium_hub:4444/wd/hub",
desired_capabilities=caps,
)
cls.driver.implicitly_wait(10)
@classmethod
def tearDownClass(cls):
cls.driver.quit()
super().tearDownClass()
def setUp(self):
# Login the user
self.assertTrue(self.client.login(username="james", password="changemequick"))
# Add cookie to log in the browser
cookie = self.client.cookies["sessionid"]
self.driver.get(self.live_server_url + reverse("find_patient"))
self.driver.add_cookie(
{
"name": "sessionid",
"value": cookie.value,
"domain": "localhost"
}
)
super().setUp()
def test_form_loader(self):
# test forms loader is functioning properly
driver = self.driver
driver.get(self.live_server_url + "/accounts/login/")
driver.find_element_by_xpath("//input[@type='submit']").click()
driver.get_screenshot_as_file("login.png")
assert len(driver.find_elements_by_css_selector(".loading")) == 0
このエラーメッセージ...
Selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
...現在のドキュメントとは異なるドメインでCookieを設定しようとする違法な試みが行われたことを意味します。
HTML-Living Standard Specs のとおり、Document Object
は、次の状況ではcookie-averse Documentオブジェクトとして分類される場合があります。
Browsing Context
がないドキュメント。Invalid cookie domain のように、現在のドメインがexample.com
である場合、このエラーが発生する可能性があります。ドメインexample.org
にCookieを追加することはできません。
例として:
サンプルコード:
from Selenium import webdriver
from Selenium.common import exceptions
session = webdriver.Firefox()
session.get("https://example.com/")
try:
cookie = {"name": "foo",
"value": "bar",
"domain": "example.org"}
session.add_cookie(cookie)
except exceptions.InvalidCookieDomainException as e:
print(e.message)
コンソール出力:
InvalidCookieDomainException: https://example.org/
ドメインexample.com
からCookieを保存した場合、これらの保存されたCookieは、Webドライバーセッションを介して他の異なるドメインにプッシュできません。 example.edu
。保存されたCookieはexample.com
内でのみ使用できます。さらに、今後ユーザーを自動的にログインするには、Cookieを1回だけ保存する必要があります。そのとき、ユーザーはログインします。Cookieを追加する前に、Cookieが収集されたのと同じドメインにアクセスする必要があります。
例として、ユーザーがアプリケーション内で次のようにログインしたら、Cookieを保存できます。
from Selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/Selenium_aut.php')
driver.find_element_by_name("username").send_keys("abc123")
driver.find_element_by_name("password").send_keys("123xyz")
driver.find_element_by_name("submit").click()
# storing the cookies
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))
driver.quit()
後でユーザーが自動的にログインできるようにする場合は、最初に特定のドメイン/ urlを参照する必要があり、次に次のようにCookieを追加する必要があります。
from Selenium import webdriver
import pickle
driver = webdriver.Chrome()
driver.get('http://demo.guru99.com/test/cookie/Selenium_aut.php')
# loading the stored cookies
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
# adding the cookies to the session through webdriver instance
driver.add_cookie(cookie)
driver.get('http://demo.guru99.com/test/cookie/Selenium_cookie.php')
chrome = 77.0.3865.75を使用しているようです。理想的には、次のことを確認する必要があります。
詳細なディスカッションは次の場所にあります。