我比较关心没有发送成功的报错。。
能不能好好排版? https://testerhome.com/markdown
每次想到未来的发展,又想学管理,希望能继续往上爬,站在更高的职位上
这个适合你
我帮他改的 我觉得 这个得了解代码 才能做好
哦 了解了。 这个其实是测试分析时候 要考虑的
怎么撞? 你多访问几次 ip 就被 ban 了。 试不出来的。
啥叫反用例,是只逆向分析么?
手机发的截图
……这倒是不错的一个主意
干嘛不直接用啊?
看了下代码,会多增加一次数据库查询,感觉太浪费了。
使用 markdown 编辑,图片代码都支持。既然在社区发帖,麻烦尊重社区也遵守规则。
把文章贴过来吧
其实我感觉是你的代入感太强了。我没有看出文章体现出来作者的优越感,感觉作者还是比较谦逊的。
个人有个人的奋斗经历,有他自己应该承受的结果,他人没必要说三道四。
如果这样,那你为什么要评价这篇文章呢? 说到底人都是八卦的。
可以
我觉得你总结的这两句话很对啊。Selenium 很落伍么?貌似目前大量的移动端 UI 测试框架都是建立在 Selenium 的基础上的。线上监控、用户行为分析、竞品对比,是挺好的,但是测试基本功得先打扎实。脚踏实地多好,每次看到有人说测试行业怎样怎样,我就想起了说中国人素质差的言论。请问你为了这个行业做了什么?
匠人的例子对于互联网来说会越来越少吧。 但是有些东西还是万变不离其宗的。
解惑,继续再接再厉,还能给大家答疑
20 楼咋删除了。。
暴露了年龄,还知道测试时代。。
看看源码
#
# Util for WebDriver
#
import sys
from string import Formatter
from functools import wraps
from numbers import Integral
from .locator import Locator
from .keys import Keys
PY3 = sys.version_info[0] == 3
class MemorizeFormatter(Formatter):
"""Customize the Formatter to record used and unused kwargs."""
def __init__(self):
"""Initialize the MemorizeFormatter."""
Formatter.__init__(self)
self._used_kwargs = {}
self._unused_kwargs = {}
def check_unused_args(self, used_args, args, kwargs):
"""Implement the check_unused_args in superclass."""
for k, v in kwargs.items():
if k in used_args:
self._used_kwargs.update({k: v})
else:
self._unused_kwargs.update({k: v})
def vformat(self, format_string, args, kwargs):
"""Clear used and unused dicts before each formatting."""
self._used_kwargs = {}
self._unused_kwargs = {}
return super(MemorizeFormatter, self).vformat(format_string, args, kwargs)
def format_map(self, format_string, mapping):
"""format a string by a map
Args:
format_string(str): A format string
mapping(dict): A map to format the string
Returns:
A formatted string.
Raises:
KeyError: if key is not provided by the given map.
"""
return self.vformat(format_string, args=None, kwargs=mapping)
def get_used_kwargs(self):
"""Get used kwargs after formatting."""
return self._used_kwargs
def get_unused_kwargs(self):
"""Get unused kwargs after formatting."""
return self._unused_kwargs
def add_element_extension_method(Klass):
"""Add element_by alias and extension' methods(if_exists/or_none)."""
def add_element_method(Klass, using):
locator = using.name.lower()
find_element_name = "element_by_" + locator
find_element_if_exists_name = "element_by_" + locator + "_if_exists"
find_element_or_none_name = "element_by_" + locator + "_or_none"
wait_for_element_name = "wait_for_element_by_" + locator
find_elements_name = "elements_by_" + locator
wait_for_elements_name = "wait_for_elements_by_" + locator
def find_element(self, value):
return self.element(using.value, value)
find_element.__name__ = find_element_name
find_element.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'element\' method."
)
def find_element_if_exists(self, value):
return self.element_if_exists(using.value, value)
find_element_if_exists.__name__ = find_element_if_exists_name
find_element_if_exists.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'element_if_exists\' method."
)
def find_element_or_none(self, value):
return self.element_or_none(using.value, value)
find_element_or_none.__name__ = find_element_or_none_name
find_element_or_none.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'element_or_none\' method."
)
def wait_for_element_by(self, *args, **kwargs):
return self.wait_for_element(using.value, *args, **kwargs)
wait_for_element_by.__name__ = wait_for_element_name
wait_for_element_by.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'wait_for_element\' method."
)
def find_elements(self, value):
return self.elements(using.value, value)
find_elements.__name__ = find_elements_name
find_elements.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'elements\' method."
)
def wait_for_elements_available(self, *args, **kwargs):
return self.wait_for_elements(using.value, *args, **kwargs)
wait_for_elements_available.__name__ = wait_for_elements_name
wait_for_elements_available.__doc__ = (
"Set parameter 'using' to '{0}'.\n".format(using.value) +
"See more in \'wait_for_elements\' method."
)
setattr(Klass, find_element_name, find_element)
setattr(Klass, find_element_if_exists_name, find_element_if_exists)
setattr(Klass, find_element_or_none_name, find_element_or_none)
setattr(Klass, wait_for_element_name, wait_for_element_by)
setattr(Klass, find_elements_name, find_elements)
setattr(Klass, wait_for_elements_name, wait_for_elements_available)
for locator in iter(Locator):
add_element_method(Klass, locator)
def fluent(func):
"""Fluent interface decorator to return self if method return None."""
@wraps(func)
def fluent_interface(instance, *args, **kwargs):
ret = func(instance, *args, **kwargs)
if ret is not None:
return ret
return instance
return fluent_interface
def value_to_key_strokes(value):
"""Convert value to a list of key strokes
>>> value_to_key_strokes(123)
['1', '2', '3']
>>> value_to_key_strokes('123')
['1', '2', '3']
>>> value_to_key_strokes([1, 2, 3])
['1', '2', '3']
>>> value_to_key_strokes(['1', '2', '3'])
['1', '2', '3']
Args:
value(int|str|list)
Returns:
A list of string.
"""
result = []
if isinstance(value, Integral):
value = str(value)
for v in value:
if isinstance(v, Keys):
result.append(v.value)
elif isinstance(v, Integral):
result.append(str(v))
else:
result.append(v)
return result
if PY3:
import builtins
exec_ = getattr(builtins, "exec")
else:
def exec_(code, globs=None, locs=None):
"""Execute code in a namespace."""
if globs is None:
frame = sys._getframe(1)
globs = frame.f_globals
if locs is None:
locs = frame.f_locals
del frame
elif locs is None:
locs = globs
exec("""exec code in globs, locs""")
一起加油~
哈哈,都是最近的事情闹的
当你身体和精力都跟不上的时候,如果年轻时候的积累已经支撑不起你前进的动力,不如主动点,急流勇退。其实不如别人并不可笑,被后辈赶超也不可笑,保持谦逊和平和的心态。到了这把年纪,在与人交谈,在舞文弄诗,写点公众号的时候,争取给人如沐春风的感觉。