Python:命令行参数与硬编码行的传递方式不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python:命令行参数与硬编码行的传递方式不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4557字,纯文字阅读大概需要7分钟。
内容图文
我正在研究一些Selenium脚本,以测试跨不同设备,浏览器和平台的站点.除了定义命令执行程序URL和浏览器功能的两行外,我可以使用相同的代码来运行脚本.
我正在尝试构建一个脚本,在其中可以使用命令行参数定义这些行.
这是我的代码:
from selenium import webdriver
import time
import sys
import getopt
def main(argv):
#define desired browser capabilities
desktopCapabilities = {'browserName': 'chrome'} #change browserName to: 'firefox' 'chrome' 'safari' 'internet explorer'
iosCapabilities = {'platformName': 'iOS' ,'platformVersion': '8.1' ,'deviceName': 'iPad Air','browserName': 'Safari'}
androidCapabilities = {'chromeOptions': {'androidPackage': 'com.android.chrome'}}
# Establish the command executor URL
desktopExecutor = 'http://127.0.0.1:4444/wd/hub'
iosExecutor = 'http://127.0.0.1:4723/wd/hub'
androidExecutor = 'http://127.0.0.1:9515'
cmdExecutor = desktopExecutor
browserCapabilities = desktopCapabilities
try:
opts, args = getopt.getopt(argv,"he:c:",["executor=","capabilities="])
except getopt.GetoptError:
print 'test.py -e <executor> -c <capabilities>'
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print 'test.py -e <executor> -c <capabilities>'
sys.exit()
elif opt in ("-e", "--executor"):
cmdExecutor = arg
elif opt in ("-c", "--capabilities"):
browserCapabilities = arg
print 'Command executor is:', cmdExecutor
print 'Desired capabilities are:', browserCapabilities
driver = webdriver.Remote(command_executor=cmdExecutor, desired_capabilities=browserCapabilities)
driver.get("http://google.com")
time.sleep(5)
driver.quit()
if __name__ == "__main__":
main(sys.argv[1:])
如果我不通过命令行添加任何参数,则此代码将按预期运行.如果我使用以下命令运行它,它也可以工作:
python test.py -e 'http://127.0.0.1:4444/wd/hub'
如果我使用以下命令运行它,则它会中断,因为-c没有作为字典传递:
python test.py -e 'http://127.0.0.1:4444/wd/hub' -c {'browserName': 'firefox'}
我该如何使用以下命令运行它:
python test.py -e iosExecutor -c iosCapabilities
这是我运行上述命令时得到的输出:
python my_script.py -e iosExecutor --capabilities iosCapabilities
Command executor is: iosExecutor
Desired capabilities are: iosCapabilities
Traceback (most recent call last):
File "my_script.py", line 38, in <module>
main(sys.argv[1:])
File "my_script.py", line 33, in main
driver = webdriver.Remote(command_executor=cmdExecutor, desired_capabilities=browserCapabilities)
File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 62, in __init__
raise WebDriverException("Desired Capabilities must be a dictionary")
selenium.common.exceptions.WebDriverException: Message: Desired Capabilities must be a dictionary
基本上它正在运行,就像我通过第33行一样:
driver = webdriver.Remote(command_executor="iosExecutor", desired_capabilities="iosCapabilities")
如果我用“ iosExecutor”和“ iosCapabilites”对第15行和第16行进行硬编码,它也可以工作,因此这告诉我这是我从CLI传递信息的方式.
任何建议都很好.我对此(编程)还很陌生,所以我猜测可能有更好的方法来完成此操作,但是Google尚未为我清除它.
解决方法:
使用argparse将使事情变得容易得多.对于功能,您可以将json.loads或ast.literal_eval用作type,例如,在此处执行以下操作:
> Accepting a dictionary as an argument with argparse and python
> type=dict in argparse.add_argument()
对于执行程序,可以将url作为字符串传递,或者定义用户友好的映射,例如:
EXECUTORS = {
'desktop': 'http://127.0.0.1:4444/wd/hub',
'ios': 'http://127.0.0.1:4723/wd/hub',
'android': 'http://127.0.0.1:9515'
}
最终的代码如下:
import ast
import time
import argparse
from selenium import webdriver
EXECUTORS = {
'desktop': 'http://127.0.0.1:4444/wd/hub',
'ios': 'http://127.0.0.1:4723/wd/hub',
'android': 'http://127.0.0.1:9515'
}
parser = argparse.ArgumentParser(description='My program.')
parser.add_argument('-c', '--capabilities', type=ast.literal_eval)
parser.add_argument('-e', '--executor', type=str, choices=EXECUTORS)
args = parser.parse_args()
driver = webdriver.Remote(command_executor=EXECUTORS[args.executor], desired_capabilities=args.capabilities)
driver.get("http://google.com")
time.sleep(5)
driver.quit()
示例脚本运行:
$python test.py -e android -c "{'chromeOptions': {'androidPackage': 'com.android.chrome'}}"
$python test.py -e ios -c "{'platformName': 'iOS' ,'platformVersion': '8.1' ,'deviceName': 'iPad Air','browserName': 'Safari'}"
$python test.py -e desktop -c "{'browserName': 'chrome'}"
而且,作为奖励,您会得到argparse神奇的内置帮助:
$python test.py --help
usage: test.py [-h] [-c CAPABILITIES] [-e {android,ios,desktop}]
My program.
optional arguments:
-h, --help show this help message and exit
-c CAPABILITIES, --capabilities CAPABILITIES
-e {android,ios,desktop}, --executor {android,ios,desktop}
内容总结
以上是互联网集市为您收集整理的Python:命令行参数与硬编码行的传递方式不同全部内容,希望文章能够帮你解决Python:命令行参数与硬编码行的传递方式不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。