Selenium 想问下大佬们,做 UI 自动化,javascript 得掌握到什么程度

testjson · 2024年01月19日 · 最后由 testjson 回复于 2024年01月19日 · 4538 次阅读

最近忙项目的功能测试,昨天项目(小程序)也上线了,所以想再看看自动化技术,想为年后跳槽做做准备
在 23 年 11 月份,去面试过一家,我对这家公司也不太满意,当然我也由于没怎么准备,面试过程中回答的也不好

我们公司做的自动化,领导只是说让做自动化,然后我自己搭建了 UI 自动化框架,接口自动化框架
由于项目(web)复杂,再加上还没完结,自动化也只写了一部分
就是一直有一个疑惑,做 webUI 自动化,要对 javascript 掌握到什么程度?因为上次这个面试就问到了,我说我不会😅

最佳回复

为每个问题提供更具体的例子:

App 测试实例

  • 安装测试:检查 app 在不同操作系统版本和设备上的安装过程是否顺畅,包括下载、安装包验证、安装进度及成功后图标是否正常显示等。
  • 弱网测试示例:模拟网络环境为 2G/3G,在这种情况下,检查 app 的加载情况(如列表刷新、页面跳转)是否能够适应并给出相应的提示。

Python 多态性实例

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def make_sound(animal):
    animal.speak()

dog = Dog()
cat = Cat()

# 多态性体现在这里,虽然传入的是父类引用,但调用的是子类的方法
make_sound(dog)  # 输出: "Woof!"
make_sound(cat)  # 输出: "Meow!"

显式等待与隐式等待在 Selenium 中的例子

  • 显式等待:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, 'dynamicElement')))
    
  • 隐式等待:

    driver.implicitly_wait(10)  # 设置全局隐式等待时间为10秒
    element = driver.find_element(By.ID, 'dynamicElement')  # 自动等待元素出现或可交互
    

定位 alert 弹框的实际代码

alert = driver.switch_to.alert
alert.accept()  # 接受弹窗

定位动态元素示例(假设一个新消息会在页面中动态加载出来):

# 使用显式等待定位动态加载的消息元素
wait = WebDriverWait(driver, 10)
message_box = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'new-message')))

left join 和 inner join 示例(使用 SQL 查询语句):

-- LEFT JOIN 示例
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

-- INNER JOIN 示例
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

Python 面向对象编程实例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce_self(self):
        return f"Hello, I am {self.name} and I am {self.age} years old."

# 创建对象
person1 = Person("Alice", 25)
print(person1.introduce_self())  # 输出: Hello, I am Alice and I am 25 years old.

# 继承与多态示例
class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade

    def introduce_self(self):
        return super().introduce_self() + f" and I am in grade {self.grade}."

student1 = Student("Bob", 16, 10)
print(student1.introduce_self())  # 输出: Hello, I am Bob and I am 16 years old and I am in grade 10.
共收到 11 条回复 时间 点赞

这是那次问的问题,问的不难,比较简单,面试完回来做了整理
1、app 如何测试?
app 的主要测试点:安装,卸载,权限,弱网,切换后台(杀进程),安全测试,稳定性测试(monkey)例如长时间运行是否崩溃等,
专项测试(耗电量,流量的使用,app 的启动速度,页面跳转速度,内存消耗,内存泄露,cpu 消耗,gpu 页面加载)
其他的与 web 类似

2、python 的多态是指什么?
是指有多种形态,比如动物类,可以有猫,狗,猪等等。(一个抽象类有多个子类,因而多态的概念依赖于继承)
指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为

3、显示等待,隐士等待是什么?
隐式等待会在全局设置一个等待时间,指在查找元素时,如果找不到元素则等待一定时间再次查找,直至超时
显式等待是指在代码中设置等待条件,直到定位到元素再进行下一步或超时后抛出异常

4、怎么定位 alter 弹框
可以使用 Alert 类来处理弹窗,
例如 driver.switchTo().alert().accept() 接受弹窗
driver.switchTo().alert().dismiss() 关闭弹窗

5、怎么定位动态元素
什么样的元素为动态元素:
怎么定位动态元素:xpath 定位
1、使用相对定位:相对定位是相对于其他元素的位置进行定位,可以使用相对元素的属性进行定位,比如相对于某个父元素或者兄弟元素进行定位。
2、使用属性定位:可以通过元素的某个属性来进行定位,比如通过元素的 class、id、name 等属性来定位元素。
3、使用 XPath 定位:XPath 是一种用于在 XML 文档中定位元素的语言,可以使用 XPath 表达式来定位动态元素。
4、使用 CSS 选择器定位:可以使用 CSS 选择器来定位元素,比如通过元素的 class、id、标签名等来定位元素。
5、使用正则表达式匹配:可以使用正则表达式来匹配动态元素的某个属性值,然后进行定位。

6、left join 与 inner join 的区别
left join 根据两个表的共有字段进行链接,返回左边表中的所有字段,以及与右边表匹配的字段,如果右边表中没有匹配的字段,则返回 NULL
SELECT 列名
FROM 左表
LEFT JOIN 右表
ON 左表.共有字段 = 右表.共有字段;
right join 根据两个表的共有字段进行链接,返回右边表中的所有字段,以及与左边表匹配的字段,如果左边表中没有匹配的字段,则返回 NULL
inner join 只返回两个表中匹配的字段
SELECT 列名
FROM 左表
inner JOIN 右表
ON 左表.共有字段 = 右表.共有字段;

7、说一下 python 的面向对象
python 与 java 一样都是面向对象编程语言,世间万事万物皆可为对象,就比如说任何事务多特性(属性)和行为(方法)

testjson 回复

1、关于 app 测试,您的回答基本正确。在测试过程中确实需要关注安装与卸载流程、权限管理、弱网络环境下的表现、后台切换及进程杀掉后恢复情况、安全测试(如数据加密、防止注入攻击等)、稳定性测试(例如 Monkey 测试)以及专项性能测试,比如耗电量、流量使用、启动速度、页面跳转速度、内存消耗、内存泄漏检测、CPU 和 GPU 占用率等。同时,针对界面和功能的测试也类似于 Web 端。

2、Python 的多态描述得较为准确。多态性是指允许你使用一个接口处理多种类型的对象,即同一种操作作用于不同的对象会得到不同的结果。例如,在继承关系中,父类的引用可以指向子类的对象,当调用具有多态性的方法时,实际执行的是子类重写的方法。

3、对于显示等待与隐式等待的概念阐述正确。显式等待是在代码中明确指定某个条件满足时继续执行,否则持续等待;而隐式等待是 Selenium 中设置全局等待时间,系统会自动在元素查找时等待指定时间,若超过这个时间还没找到元素则抛出异常。

4、定位 alert 弹窗的方法无误。通过 driver.switchTo().alert() 可以处理 alert、confirm 或 prompt 等弹窗,并使用 .accept() 接受或 .dismiss() 关闭弹窗。

5、定位动态元素的部分存在混淆。动态元素是指在页面加载后或者用户交互过程中才生成或变化的元素。定位动态元素通常采用以下策略:

  • 显式等待:根据预期条件(如元素可见、可交互等)设置等待;
  • 使用 xpath、CSS 选择器或其他定位方式结合动态属性值来定位;
  • JavaScript 执行命令获取动态元素;
  • 轮询检查元素是否存在。

6、left join、right join 与 inner join 的区别解释正确。left join 返回左表所有记录,右表匹配不到的数据为 NULL;right join 则相反,返回右表所有记录,左表匹配不到的数据为 NULL;inner join 只返回两个表的交集部分。

7、Python 面向对象的概述比较笼统。面向对象的三大特性包括封装、继承和多态。在 Python 中,可以通过定义类来创建对象,类包含了属性(数据成员)和方法(成员函数),实现对现实世界问题的抽象建模,同时支持多重继承和 Mixin 类等灵活的面向对象机制。

为每个问题提供更具体的例子:

App 测试实例

  • 安装测试:检查 app 在不同操作系统版本和设备上的安装过程是否顺畅,包括下载、安装包验证、安装进度及成功后图标是否正常显示等。
  • 弱网测试示例:模拟网络环境为 2G/3G,在这种情况下,检查 app 的加载情况(如列表刷新、页面跳转)是否能够适应并给出相应的提示。

Python 多态性实例

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def make_sound(animal):
    animal.speak()

dog = Dog()
cat = Cat()

# 多态性体现在这里,虽然传入的是父类引用,但调用的是子类的方法
make_sound(dog)  # 输出: "Woof!"
make_sound(cat)  # 输出: "Meow!"

显式等待与隐式等待在 Selenium 中的例子

  • 显式等待:

    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, 'dynamicElement')))
    
  • 隐式等待:

    driver.implicitly_wait(10)  # 设置全局隐式等待时间为10秒
    element = driver.find_element(By.ID, 'dynamicElement')  # 自动等待元素出现或可交互
    

定位 alert 弹框的实际代码

alert = driver.switch_to.alert
alert.accept()  # 接受弹窗

定位动态元素示例(假设一个新消息会在页面中动态加载出来):

# 使用显式等待定位动态加载的消息元素
wait = WebDriverWait(driver, 10)
message_box = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'new-message')))

left join 和 inner join 示例(使用 SQL 查询语句):

-- LEFT JOIN 示例
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

-- INNER JOIN 示例
SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

Python 面向对象编程实例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce_self(self):
        return f"Hello, I am {self.name} and I am {self.age} years old."

# 创建对象
person1 = Person("Alice", 25)
print(person1.introduce_self())  # 输出: Hello, I am Alice and I am 25 years old.

# 继承与多态示例
class Student(Person):
    def __init__(self, name, age, grade):
        super().__init__(name, age)
        self.grade = grade

    def introduce_self(self):
        return super().introduce_self() + f" and I am in grade {self.grade}."

student1 = Student("Bob", 16, 10)
print(student1.introduce_self())  # 输出: Hello, I am Bob and I am 16 years old and I am in grade 10.
大海 回复

大佬回答的非常不错👍

selenium 不是用 py 写的比较多么,execute_script() 需要使用到一些 js,ui 自动化的 Cypress 框架,那个是用 js 写。

大海 回复

有一股 ChatGPT 的味儿了 hhh😝

仙道彰 回复

你说的这些我知道

def alert(self, loc, value):
    try:
        element = self.locator(loc)
        self.driver.execute_script('arguments[0].value="{}"'.format(value), element)
    except Exception as e:
        logger.exception("执行js语句失败{}".format(e))

我现在的框架里也写了,我问的意思就是,要对 javascript 了解到什么程度

感觉初级水平就够了吧,本来编写 UI 自动化脚本也不是用 JS

肯定是越多越好,刚开始自动化就是看着 selenium 的文档来的,慢慢熟悉 js 后,很多东西都可以用不一样的方法

CmYzzZ 回复

好的,明白了

testjson 关闭了讨论 01月19日 18:05
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册