use*_*629 8 python selenium heroku selenium-chromedriver selenium-webdriver
我想用硒和铬测试多个移动用户代理.我正在使用python 3.6并部署到heroku.基于http://chromedriver.chromium.org/mobile-emulation.
您可以在以下位置下载用于Windows和heroku的项目:
https://github.com/kc1/mobiletest
Run Code Online (Sandbox Code Playgroud)
(请记住,如果部署到heroku,则必须将FLASK_CONFIG设置为生产.另请注意,项目中的代码与此问题略有不同,因为我过去一周一直在使用代码.)
我有:
def some_long_calculation():
driver = create_chromedriver('kkk')
# driver = create_chromedriver()
driver.get("https://www.yahoo.com/")
.....
Run Code Online (Sandbox Code Playgroud)
并且:
def create_chromedriver(ua=False):
options = webdriver.ChromeOptions()
CHROMEDRIVER_PATH = os.getenv('$HOME') or basedir+'/chromedriver.exe'
FLASK_CONFIG = os.getenv('FLASK_CONFIG')
if ua:
mobile_emulation = {"deviceName": "Nexus 5"}
options.add_experimental_option("mobileEmulation", mobile_emulation)
if FLASK_CONFIG and FLASK_CONFIG == "production":
CHROMEDRIVER_PATH = '/app/.chromedriver/bin/chromedriver'
GOOGLE_CHROME_SHIM = os.getenv('$GOOGLE_CHROME_SHIM') or 'no path found'
options.binary_location = '/app/.apt/usr/bin/google-chrome-stable'
options.add_argument('--disable-gpu')
options.add_argument('--no-sandbox')
return webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)
Run Code Online (Sandbox Code Playgroud)
如果我在启用移动浏览器的情况下在本地运行它按预期工作:
如果我在启用了移动浏览器的情况下在heroku上运行它:
然后我在heroku上尝试了移动用户,我得到了:
所以至少我知道设置工作就像chrome和chromedriver一样.
heroku日志:
2018-07-15T17:37:53.967643+00:00 app[web.1]: driver = create_chromedriver('kkk')
2018-07-15T17:37:53.967637+00:00 app[web.1]: png = some_long_calculation()
2018-07-15T17:37:53.967645+00:00 app[web.1]: File "/app/app/main/cl.py", line 120, in create_chromedriver
2018-07-15T17:37:53.967640+00:00 app[web.1]: File "/app/app/main/cl.py", line 123, in some_long_calculation
2018-07-15T17:37:53.967648+00:00 app[web.1]: return webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)
2018-07-15T17:37:53.967651+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 75, in __init__
2018-07-15T17:37:53.967654+00:00 app[web.1]: desired_capabilities=desired_capabilities)
2018-07-15T17:37:53.967656+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 156, in __init__
2018-07-15T17:37:53.967659+00:00 app[web.1]: self.start_session(capabilities, browser_profile)
2018-07-15T17:37:53.967661+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 251, in start_session
2018-07-15T17:37:53.967669+00:00 app[web.1]: response = self.command_executor.execute(driver_command, params)
2018-07-15T17:37:53.967664+00:00 app[web.1]: response = self.execute(Command.NEW_SESSION, parameters)
2018-07-15T17:37:53.967667+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 318, in execute
2018-07-15T17:37:53.967672+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/remote_connection.py", line 472, in execute
2018-07-15T17:37:53.967674+00:00 app[web.1]: return self._request(command_info[0], url, body=data)
2018-07-15T17:37:53.967677+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/selenium/webdriver/remote/remote_connection.py", line 496, in _request
2018-07-15T17:37:53.967679+00:00 app[web.1]: resp = self._conn.getresponse()
2018-07-15T17:37:53.967682+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/http/client.py", line 1331, in getresponse
2018-07-15T17:37:53.967685+00:00 app[web.1]: response.begin()
2018-07-15T17:37:53.967687+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/http/client.py", line 297, in begin
2018-07-15T17:37:53.967695+00:00 app[web.1]: line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
2018-07-15T17:37:53.967690+00:00 app[web.1]: version, status, reason = self._read_status()
2018-07-15T17:37:53.967698+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/socket.py", line 586, in readinto
2018-07-15T17:37:53.967692+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/http/client.py", line 258, in _read_status
2018-07-15T17:37:53.967700+00:00 app[web.1]: return self._sock.recv_into(b)
2018-07-15T17:37:53.967712+00:00 app[web.1]: ConnectionResetError: [Errno 104] Connection reset by peer
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
编辑:
谢谢你的详细解答.我已经更改了代码以包含您提到的标志.Chrome版本为67.0.3396.99.Chromedriver是2.40,硒是3.13.不幸的是,结果没有变化.我仍然得到同样的错误.至于你的第2阶段和第3阶段的建议.我正在部署到heroku,所以我没有完全控制环境变量.有没有办法使用python进行这些更改?
编辑2:
我在https://sites.google.com/a/chromium.org/chromedriver/mobile-emulation上对此进行了更多考虑,示例使用
from selenium import webdriver
mobile_emulation = { "deviceName": "Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities = chrome_options.to_capabilities())
Run Code Online (Sandbox Code Playgroud)
您是否建议浏览器位于" http://127.0.0.1:4444/wd/hub "
通常,当客户端突然终止而不关闭连接时,由底层OS RST packet的TCP/IP堆栈发送.Python将此转换为异常,文本Connection由peer重置.根据你的错误堆栈跟踪,这意味着一旦self._read_status()被调用(内部)Python假定接收某些东西,但连接突然被删除,Python通过引发异常通知你这个错误:
ConnectionResetError: [Errno 104] Connection reset by peer
Run Code Online (Sandbox Code Playgroud)
情况有点类似于这个表达式:
"通过对等方重置连接"是TCP/IP等同于将手机重新关闭.它更礼貌而不仅仅是不回复,留下一个悬挂.但这并不是真正礼貌的TCP/IP逆转所期望的FIN-ACK.
此错误背后可能存在多个概率,如下所示.
一个快速而精确的解决方案是添加一些推荐的ChromeOptions以及现有的ChromeOptions,如下所示:
options.add_argument("start-maximized"); // open Browser in maximized mode
options.add_argument("disable-infobars"); // disabling infobars
options.add_argument("--disable-extensions"); // disabling extensions
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage"); // overcome limited resource problems
Run Code Online (Sandbox Code Playgroud)
然后
return webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, options=options)
Run Code Online (Sandbox Code Playgroud)
注意:您需要删除该参数,options.add_argument('--disable-gpu')因为它仅适用于Windows操作系统.
几点:
Python Chrome Mobile Emulation的关键和价值对似乎是"deviceName": "Google Nexus 5"(不"deviceName": "Nexus 5")您可以调整代码以Remote()通过以下任一方式调用 -
调用Remote()通过DesiredCapabilities():
from selenium import webdriver
# import DesiredCapabilities was missing in your program
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
mobile_emulation = { "deviceName": "Google Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
capabilities = DesiredCapabilities.CHROME
capabilities = options.to_capabilities()
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities = capabilities)
Run Code Online (Sandbox Code Playgroud)你会发现在调用类似的讨论Remote(),通过ChromeOptions()在如何硒铬选项添加到"desiredCapabilities"?
调用Remote()通过ChromeOptions():
from selenium import webdriver
mobile_emulation = { "deviceName": "Google Nexus 5" }
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Remote(command_executor='http://127.0.0.1:4444/wd/hub', options=chrome_options)
Run Code Online (Sandbox Code Playgroud)你会发现在调用类似的讨论Remote(),通过ChromeOptions()在远程的webdriver UnreachableBrowserException:无法启动新的会话
Webdriver.androidGetting started with Selendroid如果仍然看到错误,请执行以下升级/清除任务:
driver.quit()在tearDown(){}方法内调用以正常关闭和销毁WebDriver和Web Client实例.@Test.在寻找针对特定错误的精细解决方案时,我进入了Amazon S3和"Peer连接重置",其中Garry Dolley将问题的原因归结为下述因素的组合:
Linux内核2.6.17+增加了TCP窗口/缓冲区的最大大小,如果它无法处理足够大的TCP窗口,这开始导致其他设备退出.齿轮会重置连接,我们将其视为"通过对等连接重置"消息.
一个可行的解决方案是将以下条目放入/etc/sysctl.conf:
注意:此修复很容易,但它会降低您的最大吞吐量,更快下载速度.
如果适用,请确保系统上的/ etc/hosts包含以下条目:
127.0.0.1 localhost.localdomain localhost
Run Code Online (Sandbox Code Playgroud)
以下是一些相关的讨论:
以下是此讨论的参考:
| 归档时间: |
|
| 查看次数: |
5404 次 |
| 最近记录: |