Selenium 类的实例化 driver 的初始化问题

吴俊 · 2018年08月06日 · 最后由 吴俊 回复于 2018年08月07日 · 1772 次阅读

已经调通,为避免泄露公司地址,关闭帖子

共收到 20 条回复 时间 点赞
吴俊 关闭了讨论 08月08日 15:58
吴俊 #20 · 2018年08月07日 Author

TypeError: object of type 'WebElement' has no len() elementInfo 是这个重复吗

find.element_by_xpath 写错了,是 find_element_by_xpath

吴俊 #18 · 2018年08月07日 Author


按你的方法写了,和以前是一样报 AttributeError: 'WebDriver' object has no attribute 'find' 我这封装有问题出在哪里 呢

吴俊 回复

就是上面的代码

  • driver 默认值设成 None,生成实例的时候,不要传 self 了。
  • setUpClass 中,browserengine 改成 self. browserengine
吴俊 #16 · 2018年08月07日 Author
chu 回复

那我这个要改的话,要怎么改,是哪里的错呢,

chu 回复

嗯,明白,感谢,不打算像现在这样写了

def __init__(self, driver):
        self.driver = driver

既然 driver 是通过 get_browser 设置 driver,可以把初始化的 driver 改一下默认值

def __init__(self, driver=None):
        self.driver = driver
def setUpClass(self):
    #browserengine = BrowserEngine(self)
    # self 是 单元测试的示例,相当于把 driver 设置成单元测试类的示例了。
    # 改为
    self.browserengine = BrowserEngine()
    self.driver = browserengine.get_browser()

如果不是对 unittest 很熟悉,不建议用 setup 或 init 来初始化,可以在另一个文件中,生成 BrowserEngine 实例,在测试类中 import 这个实例, 简单例子

# commonTools1
class BrowserEngine():
    pass

browserengine = BrowserEngine()

# 测试类
from appProject.commonTools1 import browserengine
吴俊 #13 · 2018年08月06日 Author
洛凉 回复

这个也是个思路,回头可以试试,感谢

我没有写过 object 类,我直接一个文件继承 unittest,这个文件里写好了自动化执行的操作,初始化 driver,然后测试用例里面再继承我自己写的类,再断言

吴俊 #11 · 2018年08月06日 Author
皆非 回复

感谢,一直不知道这个怎么样,已经上传上去了

用这个发代码

皆非 回复

嗯,我自己想封装看看,看自己写的对不对,我传截图吧,截图好看点

吴俊 回复

建议你不要使用封装的 findelement 试试,太乱没看懂你的封装。
你可以试试

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait as WT
皆非 回复

浏览器起来没有问题,做点击操作后报找不到元素,但这个元素写法是正确的,在其他地方用了这个元素

复制楼主的代码修改如下

class BrowserEngine(object):
    def __init__(self,driver):
        self.driver = driver

    """控制启动浏览器"""
    def get_browser(self,browser='Chrome'):
        """启动判断浏览器"""
        if browser == 'Firefox':
            self.driver = webdriver.Firefox()
        elif browser == 'Chrome':
            self.driver = webdriver.Chrome()
        elif browser == 'IE':
            self.driver = webdriver.Ie()
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        self.driver.get("https://sso.dev.weixiuhui.cn/cas/login")
        return self.driver
    ..........

在调用就没问题了
然后 setUp 不要用 @classmethod,建议查看一下 setUp 和 setUpClass

吴俊 回复

markdown 就是一个页面编辑格式, 你编辑的时候可以看到有说明;

这个抛错是说 找不到这个元素。

下面这段是代码逻辑的问题
self.driver = driver
self.browser
你这个过度封装了吧,是想把 self.driver.get_browser()
下面函数里 你上面 self.driver 不都变成成员变量了吗。。。又用回右边的变量

Jerry li 回复

markdown 还没用过,不知道是什么效果,不传进去会报错

另外代码用 markdown 改一下吧, 这种代码格式大牛们是不屑于看的

干嘛要把 self 传进去?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册