Sta*_*Edd 8 django selenium selenium-grid docker docker-compose
我正在使用 seleniumgrid 为 chrome 和 firefox 设置测试。我正在使用 docker images 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
Run Code Online (Sandbox Code Playgroud)
当我尝试运行测试时,我总是遇到此错误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)
Run Code Online (Sandbox Code Playgroud)
测试参考教程。
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
Run Code Online (Sandbox Code Playgroud)
Deb*_*anB 10
这个错误信息...
selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
Run Code Online (Sandbox Code Playgroud)
...暗示非法尝试在与当前文档的域不同的域下设置 cookie。
根据HTML-Living 标准规范Document Object,在以下情况下,a可能被归类为不喜欢 cookie 的 Document 对象:
Browsing Context.根据无效的 cookie 域,如果当前域是example.com,则可能会发生此错误,将无法为域添加 cookie example.org。
举个例子:
示例代码:
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)
Run Code Online (Sandbox Code Playgroud)控制台输出:
InvalidCookieDomainException: https://example.org/
Run Code Online (Sandbox Code Playgroud)如果您已存储来自 domain 的 cookie example.com,则这些存储的 cookie无法通过 webdriver 会话推送到任何其他不同的域,例如example.edu. 存储的 cookie 只能在example.com. 此外,为了将来自动登录用户,您只需要存储一次 cookie,那就是用户登录时。在添加回 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()
Run Code Online (Sandbox Code Playgroud)
之后如果你想让用户自动登录,你需要先浏览到特定的域/url,然后你必须添加cookies,如下所示:
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')
Run Code Online (Sandbox Code Playgroud)
看来您正在使用chrome=77.0.3865.75。理想情况下,您需要确保:
您可以在以下位置找到详细讨论:
在selenium中,我们必须使用测试服务器的URL,默认情况下这是localhost,以启用对外部可访问服务器地址的访问,这是托管docker容器的地址,我们需要使用服务器计算机的IP地址,因此设置如下,
class BaseTestCase(StaticLiveServerTestCase):
"""
Provides base test class which connects to the Docker
container running Selenium.
"""
host = '0.0.0.0' # Bind to 0.0.0.0 to allow external access
@classmethod
def setUpClass(cls):
super().setUpClass()
# Set host to externally accessible web server address
cls.host = socket.gethostbyname(socket.gethostname())
Run Code Online (Sandbox Code Playgroud)
参考这里
| 归档时间: |
|
| 查看次数: |
16033 次 |
| 最近记录: |