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

sum · 2018年08月06日 · 最后由 sum 回复于 2018年08月07日 · 600 次阅读

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

共收到 20 条回复 时间 点赞

干嘛要把 self 传进去?

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

sum #3 · 2018年08月06日 作者
jerrylizilong 回复

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

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

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

sum 回复

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

复制楼主的代码修改如下

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

sum #7 · 2018年08月06日 作者
zhangjg0919 回复

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

sum 回复

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

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait as WT
sum #9 · 2018年08月06日 作者
zhangjg0919 回复

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

用这个发代码

sum #11 · 2018年08月06日 作者
zhangjg0919 回复

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

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

sum #13 · 2018年08月06日 作者
ygq8988 回复

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

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
sum #15 · 2018年08月06日 作者
harris 回复

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

sum #16 · 2018年08月07日 作者
harris 回复

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

sum 回复

就是上面的代码

  • driver 默认值设成 None,生成实例的时候,不要传 self 了。
  • setUpClass 中,browserengine 改成 self. browserengine
sum #18 · 2018年08月07日 作者


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

find.element_by_xpath 写错了,是 find_element_by_xpath

sum #20 · 2018年08月07日 作者

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

sum 关闭了讨论 08月08日 15:58
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册