自动化测试——webdriver中常见的API

  1. 一个简单脚本
# coding = utf-8 # 可加可不加,防止乱码
from selenium import webdriver # 要想使用selenium 的webdriver 里的函数,首先把包导进来
import time # 导入时间
browser = webdriver.Firefox() # 启动浏览器,浏览器可以随便换,但是前提是得把相应的驱动配置好了
time.sleep(3) # 停3秒
browser.get("http://www.baidu.com") # 得到url,进入网页
time.sleep(3)
browser.find_element_by_id("kw").send_keys("selenium") #一个元素有若干属性id 、name等,这里利用id属性定位到百度输入框,send_keys表示在输入框里输入selenium。
time.sleep(3)
browser.find_element_by_id("su").click() # 利用id定位到搜索的按钮 ,click()表示点一下按钮
browser.quit() # 退出并关闭窗口的每一个相关的驱动程序
  1. 元素的定位
    条件:元素拥有该属性,并且该属性全局唯一
    webdriver 提供了一系列的对象定位方法,常用的有以下几种:id、name、class name、link text、partial link text、tag name、xpath、css selector
    具体操作见https://github.com/Li-wenyan/learn-java/tree/master/AutomatedTesting
  2. 操作测试对象
    定位只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于定位的是按钮还输入框。
    一般来说,webdriver 中比较常用的操作对象的方法有下面几个:
    click 点击对象
    send_keys 在对象上模拟按键输入
    clear 清除对象的内容,如果可以的话
    submit 清除对象的内容,如果可以的话
    text 用于获取元素的文本信息
  3. 添加等待
    固定等待:time.sleep(5),设置几秒就等待几秒
    只能等待:implicitly_wait(5),等待的时间为0~5秒
  4. 打印信息
    title(打印的是上一个页面的),url
  5. 浏览器的操作
    浏览器最大化:maximize_window()
    浏览器最小化:minimize_window()
    设置浏览器宽、高:set_window_size(480, 800) # 宽480、高800
    操作浏览器的前进、后退:forward(),back()
    控制浏览器滚动条:
    js=“var q=document.documentElement.scrollTop=10000” # 10000表示拖到底部,0表示拖到顶部
    driver.execute_script(js)
  6. 键盘事件
    (1)键盘按键用法
    要想调用键盘按键操作需要引入keys 包:
    from selenium.webdriver.common.keys import Keys
    通过send_keys()调用按键:
    send_keys(Keys.TAB) # TAB
    send_keys(Keys.ENTER) # 回车
    (2)键盘组合键用法
    send_keys(Keys.CONTROL,‘a’) # 等于ctr+a 全选
    send_keys(Keys.CONTROL,‘x’) # 等于ctr+x 剪切
  7. 鼠标事件
    ActionChains 类
    context_click() 右击
    double_click() 双击
    drag_and_drop() 拖动
    move_to_element() 移动
    ActionChains(driver)生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为,例如:
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
  1. 定位一组元素
    webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法
    定位一组对象一般用于以下场景:
    批量操作对象,比如将页面上所有的checkbox 都勾上;
    先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的checkbox,然后选择最后一个
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
  1. 多层框架/窗口定位
    有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,seelnium webdriver 提供了一个switch_to.frame 方法,可以很轻松的来解决这个问题。
    frame中实际上是嵌入了另一个页面,而webdriver每次只能在一个页面识别,因此才需要用switch_to.frame方法去获取frame中嵌入的页面,对那个页面里的元素进行定位。
    switch_to.default_content:从frame中嵌入的页面里跳出,跳回到最外面的原始页面中
    有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switch_to.window,用法与switch_to.frame 相同
  2. 层级定位
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('level_locate.html')
dr.get(file_path)
#点击Link1链接(弹出下拉列表)
dr.find_element_by_link_text('Link1').click()
#找到id 为dropdown1的父元素
#WebDriverWait(dr, 10), 10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。
#is_displayed(), 该元素是否用户可以见
WebDriverWait(dr,10).until(lambda the_driver:
the_driver.find_element_by_id('dropdown1').is_displayed())
#在父亲元件下找到link 为Action 的子元素
menu = dr.find_element_by_id('dropdown1').find_element_by_link_text('Action')
#鼠标定位到子元素上
webdriver.ActionChains(dr).move_to_element(menu).perform()
time.sleep(2)
dr.quit()
  1. 下拉框处理
    对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项
  2. alert、confirm、prompt 的处理
    text 返回alert/confirm/prompt 中的文字信息
    accept 点击确认按钮
    dismiss 点击取消按钮,如果有的话
    send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错
#接受警告信息
alert = dr.switch_to.alert()
alert.accept()
#得到文本信息打印
alert = dr.switch_to.alert()
print alert.text
#取消对话框(如果有的话)
alert = dr.switch_to.alert()
alert.dismiss()
#输入值
alert = dr.switch_to.alert()
alert.send_keys("hello word")
  1. DIV对话框的处理
  2. 上传文件操作
    文件上传操作也比较常见功能之一,上传功能没有用到新有方法或函数,关键是思路。
    上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在

详见:https://github.com/Li-wenyan/learn-java/tree/master/AutomatedTesting

<think>好的,用户的问题是VMware Ubuntu虚拟机界面卡顿的原因和解决方案。我需要结合之前提供的引用信息,分析可能的原因,并给出对应的解决办法。 首先,用户提到的引用中有三个相关的内容。引用[1]提到了安装VMware Tools的重要性,特别是对于鼠标和分辨率的优化。引用[2]提到了键盘卡顿的问题,可能与输入延迟有关。引用[3]则指出Hyper-V与VMware的冲突可能导致卡顿或卡死。 接下来,我需要考虑界面卡顿的可能原因。首先,VMware Tools是否安装正确?如果没有安装或配置不当,可能会导致图形性能不佳。其次,虚拟机的硬件加速设置是否正确,比如是否启用了3D加速。然后,显示驱动的问题,比如Ubuntu默认的驱动是否合适。另外,资源分配不足,比如内存或CPU分配过少,也可能导致卡顿。还有,Hyper-V与VMware的兼容性问题,这在引用[3]中提到过,关闭相关选项可能有效。最后,Xorg配置的问题,特别是如果xorg.conf文件缺失或配置不当,可能影响显示性能,引用[1]里提到生成这个文件的步骤。 解决方案方面,首先应该检查VMware Tools的安装和配置,确保其正确运行并启用自动调整分辨率和鼠标集成。然后,调整虚拟机的硬件设置,比如分配更多内存或CPU核心,启用3D加速。检查Hyper-V是否开启,如果有的话需要关闭,尤其是Windows主机上的相关功能。另外,更新Ubuntu系统和驱动,使用开源或专有显卡驱动可能改善性能。生成或调整xorg.conf配置文件,确保显示设置正确。调整Unity或GNOME的图形效果,降低动画效果以减少资源消耗。最后,检查后台进程,关闭不必要的应用释放资源。 在回答时,需要分点列出原因和对应的解决方案,结构清晰,让用户逐步排查。同时,要确保提到的命令和步骤准确,比如生成xorg.conf的具体命令,关闭Hyper-V的方法等。引用相关引用作为支持,比如引用[1]关于VMware Tools的配置,引用[3]关于Hyper-V的问题。此外,可能还需要提醒用户检查虚拟机设置中的其他选项,如虚拟化引擎的偏好设置,是否启用了虚拟化技术等。 需要确认用户是否已经尝试了基本的步骤,比如安装VMware Tools,如果用户没有提到,可能需要作为首要解决方案。此外,资源分配的问题也需要详细说明,比如建议至少分配2GB内存和2个CPU核心。对于Hyper-V冲突,需要指导用户如何在Windows功能中关闭相关选项,并检查VMware的侧通道缓解设置。 最后,生成相关问题,可能涉及性能优化、其他卡顿情况(如键盘)、VMware Tools的高级配置等,帮助用户进一步解决问题。</think>### VMware Ubuntu虚拟机界面卡顿原因及解决方案 #### 一、可能原因分析 1. **VMware Tools未正确安装或配置** - VMware Tools提供虚拟硬件驱动和性能优化,未安装或配置错误会导致图形渲染卡顿[^1]。 2. **硬件加速未启用或资源分配不足** - 虚拟机未启用3D加速功能,或CPU/内存分配过少(如默认1核CPU、1GB内存)。 3. **Hyper-V与VMware兼容性问题** - Windows主机开启Hyper-V会导致VMware虚拟机性能下降甚至卡死[^3]。 4. **Xorg显示配置问题** - Ubuntu自9.10后默认无`xorg.conf`文件,若显示器分辨率或刷新率未适配,可能引发卡顿[^1]。 5. **输入设备延迟** - 键盘/鼠标的虚拟化处理存在延迟,可能与VMware输入优化设置相关[^2]。 --- #### 二、具体解决方案 ##### 1. 检查并完善VMware Tools配置 - **安装/更新VMware Tools**: ```bash sudo apt reinstall open-vm-tools open-vm-tools-desktop sudo reboot ``` - **启用自动分辨率适配**: 确保VMware菜单栏 > 查看 > 自动调整大小 > 选择“自动适应客户机”。 ##### 2. 调整虚拟机硬件设置 - **分配更多资源**(建议最低配置): - CPU:2核以上 - 内存:2GB以上 - 显存:4GB(需勾选“3D加速”) - **启用3D加速**: 虚拟机设置 > 显示器 > 勾选“加速3D图形”。 ##### 3. 关闭Windows主机的Hyper-V - **步骤**: 1. Windows搜索“启用或关闭Windows功能” > 取消勾选 **Hyper-V** 和 **虚拟机平台**。 2. VMware设置 > 首选项 > 侧通道缓解 > 关闭“禁止在启用了Hyper-V的主机上启用侧通道缓解”[^3]。 3. 重启主机。 ##### 4. 生成/修改Xorg配置文件 - **生成`xorg.conf`**(适用于分辨率异常): ```bash sudo Xorg -configure # 生成xorg.conf.new测试文件 sudo cp /root/xorg.conf.new /etc/X11/xorg.conf sudo reboot ``` - **手动调整分辨率**: 编辑`xorg.conf`的`Section "Screen"`部分,添加支持的显示模式。 ##### 5. 优化Ubuntu图形设置 - **降低图形特效**(适用于GNOME桌面): ```bash sudo apt install gnome-tweaks gnome-tweaks # 在“外观”中关闭动画效果 ``` - **更换显卡驱动**: 在“软件和更新 > 附加驱动”中选择专有驱动(如NVIDIA闭源驱动)。 ##### 6. 排查输入延迟问题 - **调整VMware输入设置**: 虚拟机设置 > 高级 > 取消勾选“捕获键盘输入时优化鼠标移动”。 - **禁用Ubuntu合成器**(临时测试): ```bash sudo systemctl stop gdm # 重启后会恢复 ``` --- #### 三、验证与调试 - **测试方法**: 1. 执行`vmware-toolbox-cmd stats`查看性能数据。 2. 使用`glxgears`命令测试图形帧率(正常应>1000 FPS)。 3. 监控资源占用:`htop`或`gnome-system-monitor`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值