• 干嘛不直接用啊?

  • 看了下代码,会多增加一次数据库查询,感觉太浪费了。

  • Appuim 源码剖析 (Boottrap) at 2017年02月27日

    使用 markdown 编辑,图片代码都支持。既然在社区发帖,麻烦尊重社区也遵守规则。

  • Appuim 源码剖析 (Boottrap) at 2017年02月27日

    把文章贴过来吧

  • 其实我感觉是你的代入感太强了。我没有看出文章体现出来作者的优越感,感觉作者还是比较谦逊的。

    个人有个人的奋斗经历,有他自己应该承受的结果,他人没必要说三道四。

    如果这样,那你为什么要评价这篇文章呢? 说到底人都是八卦的。

  • 可以

  • 我觉得你总结的这两句话很对啊。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""")
    
    
    
  • 一起加油~

  • 哈哈,都是最近的事情闹的

  • 当你身体和精力都跟不上的时候,如果年轻时候的积累已经支撑不起你前进的动力,不如主动点,急流勇退。其实不如别人并不可笑,被后辈赶超也不可笑,保持谦逊和平和的心态。到了这把年纪,在与人交谈,在舞文弄诗,写点公众号的时候,争取给人如沐春风的感觉。

  • 问题抛得太大。说中午吃什么,如果美团,饿了么都不愿意打开,那就得期待有好队友帮你打开美团,饿了么,最好还帮你领下外卖。

    再说了,如果百分百契合你的解决方案,那真是私人定制了。给个建议吧,官方的样例代码里的 python 项目,扒下来看看。

    如果有其他问题的话,请贴出具体问题。

  • 2月 要结束啦~ at 2017年02月24日

    已经邀请

  • 京东同学,排版~

  • 腾讯 WeTest 首次展示包括《王者荣耀》、《火影忍者》、《剑网 3》、《天天飞车》等腾讯旗下的 S 级游戏的自动化测试方案。

    这个非常屌

  • 检查时间是否正确(针对 https 请求)这条不错。

  • 看看是不是连了代理

  • 求助明白的大神,给点干货的帮助

    这样一说,感觉以前对 H5 测试的文章大家都白写了。搜索下社区吧。

  • 排序问题解决了。

  • ……

  • 我觉得这个可能不是公司的意思,那真的应该是招聘主管的意思。