liuxianzhong-123

第一部分  Selenium

1. Selenium有哪些组件?

  最早的有

  1.Selenium IDE,IDE只支持安装在fiefox上一个插件,支持录制自动化脚本。

  2.remote RC

  3.Grid

  4.webdriver。我们一般最重要的就是使用webdriver。

2.在selenium中,有哪些不同定位元素方法

  ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selector

3.Selenium有什么限制或者缺陷

   除了基于web的软件和mobile的程序,selenium不支持桌面软件自动化测试。软件测试报告,和用例管理只能依赖第三方插件,例如Junit/TestNG和unittest。由于它是免费的软件,所以没有供应商去提供支持和服务,有问题,只能求助selenium社区。还有一个就是,selenium入门门槛可能有点高,需要具备一定编程语言基础的才能玩转。

(1) Selenium仅支持基于Web的应用程序的测试;

(2) 无法使用Selenium测试移动应用程序,可以选择Appium进行移动端功能测试;

(3) 验证码和条形码阅读器无法使用Selenium进行测试;

(4) Selenium本身不具有生成测试报告的功能,以JAVA为例,需要结合第三方框架如TestNG或JUnit来生成测试报告。

4.如何提高 Selenium 脚本的执行速度?

  1)排除硬件和网络问题。     

  2)不要过多使用强制等待,尽量使用显式等待。   

  3)选择性能较好的浏览器,例如:chrome, safari。 

  4)分布式执行,Selenium grid支持多个浏览器同时执行,并且互不干扰,而且可以进行远程部署。

5.Selenium是否支持桌面应用软件的自动化测试。

  Selenium不支持桌面软件的自动化测试,Selenium是根据网页元素的属性才定位元素,而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素,当然现在也有根据桌面元素的属性来定位的。

6.Seleinum是否有读取excel文件的库

  没有,这里需要用到第三方工具。例如Apache POI插件。

7.举例一下你遇到过那些异常,在selenium自动化测试过程中

  通过这个问题,大概知道你写过多少脚本。写脚本过程最常见的异常就是,这个元素无法找到。常见的selenium有以下这些:

  1、ElementNotSelectableException :元素不能选择异常

  2、ElementNotVisibleException :元素不可见异常

  3、NoSuchAttributeException :没有这样属性异常

  4、NoSuchElementException:没有该元素异常

  5、NoSuchFrameException :没有该frame异常

  6、TimeoutException : 超时异常

  7、Element not visible at this point :在当前点元素不可见

8. Selenium怎么判断元素是否存在?

  答:1. 其实Selenium是没有现成的方法判断一个元素是否存在,所以我们可以选择曲线救国,把想要寻找的元素放在一个list中,判断list的size()是否为0,为0则不存在;不为0则存在。

    2.或者通过try catch的方式,当元素不存在时,捕捉异常,并且有相应的提示信息。

  如下为放在list中的伪代码,大概思路就是这样。

List<WebElement> list = driver.findelements(By.xpath(""));
int size = list.size();
if(size==0){
    System.out.println("元素不存在于此页面!");
} else{
    System.out.println("元素存在于此页面!");
}

 9. 关闭浏览器中quit和close的区别

   简单来说,两个都可以实现退出浏览器session功能,close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session。知道这两个区别,我们就知道quit一般用在结束测试之前的操作,close用在执行用例过程中关闭某一个页面的操作。 

10. Selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元素一 定是可以点击的?

  1.添加元素智能等待时间 driver.implicitly_wait(30)

  2.添加强制等待时间(比如 python 中写 sleep)

  3.try 方式进行 id,name,clas,x path, css selector 不同方式进行定位,如 果第一种失败可以自动尝试第二种

11. Selenium是否支持用例的执行的引擎。

  引擎好比就是一个发动机。Selenium是没有关于测试用例和测试套件管理和执行的模块。我们需要借助第三方单元测试框架来实现用例管理和用例的执行。例如Java中有Junit或者testNG,Python中有unittest单元测试框架。

 12. 如何查找元素是否显示在屏幕上?

   答:WebDriver通过isDisplayed(), isSelected(), isEnabled(),这三种方法判断Web元素的可见性,这类方法将返回结果是布尔类型;Web元素可以是按钮,下拉框,复选框,单选按钮,标签等。

 

  (1)isDisplayed():

  boolean b1 = driver.findElement(By.id(“XXX”)).isDisplayed();

  (2)isSelected():

  boolean b2 = driver.findElement(By.id(“XXX”)).isSelected();

  (3)isEnabled():

  boolean b3 = driver.findElement(By.id(“XXX”)).isEnabled();

第二部分  元素定位

1.如何处理alert弹窗

  1. 切换到AlertAlert alert = driver.switchTo().alert();

  1.1 点击弹窗上确定按钮alert.accept();

  1.2 点击弹窗的取消按钮alert.dismiss()

  2. 获取弹窗上线上的文本文字内容alert.getText();

  2.1 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入alert.sendkeys();

2.在selenium中如何处理多窗口?

  1.先打印所有的窗口  窗口句柄   windows = driver.window_handles

  2.切换到最后的窗口driver.switch_to.window(windows[-1])

3.你查找元素遇到过在Frame里面吗?你是如何处理Frame里面元素定位的?

 

  1. 先判断元素是否在iframe中 frame_el = driver.find_element_by_xpath("//iframe[@name=\'baidu\']")

  2. 切换到iframe中 driver.switch_to.frame(frame_el)

  3.定位元素 driver.find_element_by_id(\'kw\')

  4.返回主页面 driver.switch_to.default_content()

5.如何处理下拉菜单?

  1.. 二次定位的方法 先定位select按钮 再通过索引定位不同下拉框元素

driver.find_element_by_id("nr").find_element_by_xpath("//option[@value=\'50\']").click()

 

   2. 可以导入select 模块

1.先导入select模块
from selenium.webdriver.support.select import Select   
2. 通过select的选项索引进行定位
select_by_index(2)

3.select_by_index()  :通过索引定位select_by_value()  :通过value值定位select_by_visible_text() :通过文本值定位
deselect_all()          :取消所有选项
deselect_by_index()     :取消对应index选项
deselect_by_value()      :取消对应value选项deselect_by_visible_text() :取消对应文本选项
first_selected_option()  :返回第一个选项
all_selected_options()   :返回所有的选项

 

6.在Selenium中如何实现拖拽滚动条?

  selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。

1. 可以先使用 scrollHeight 获取对象的滚动高度。 
2. 根据元素进行定位  使用 scrollTo 函数进行定位
scrollTo(x, y)js = "window.scrollTo(100,400);"
driver.execute_script(js)

3.滚动到底部
js = "window.scrollTo(0,document.body.scrollHeight)"
driver.execute_script(js)

4.滚动到顶部
js = "window.scrollTo(0,0)"  
driver.execute_script(js)


什么是JavaScript Executor,你什么时候会用到这个?
JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。还是有比较多的场景,我们可能或者需要借助javaScript来实现:
1.元素通过现有定位表达式不能够实现点击
2.前端页面试用了ck-editor这个插件
3.处理时间日期插件(可能)
4.生成一个alert弹窗
5.拖拽滚动条基本语法:
JavascriptExecutor js =(JavascriptExecutor) driver;
js.executeScript(Script,Arguments);

 

 

 

7. 如何实现文件上传?

  1. input标签 可以用selenium提供的send_keys()方法轻松解决;

  2.非input标签 可以借助autoit工具或者SendKeys第三方库。

8.在Selenium中如何实现截图,如何实现用例执行失败才截图

在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法可以实现全屏截图。然后我们通过java中的FileUtils来实现把这个截图拷贝到保存截图的路径。

代码举例:
File src=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
// 拷贝到我们实际保存图片的路径

FileUtils.copyFile(src,new File(“C:/selenium/error.png”));
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
如果要实现执行用例发现失败就自动截图,那么我们需要把这个截图方法进行封装。然后在测试代码中的catch代码块去调用这个截图方法。这个我们在POM的框架中一般是把截图方法封装到BasePage这个文件中。

答:通过selenium提供的TakesScreenshot和OutputType 完成屏幕截图。

 

Sample Code:

// 获取截屏

File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

// 将截屏保存到指位置

FileUtils.copyFile(scrFile, new File("C:\\CaptureScreenshot\\sample.jpg"))

 

 

 

 

9. 在执行脚本过程,如何实现当前元素高亮显示?

   利用javaScript去修改当前元素的背景颜色来到达高亮显示的效果,

10.如何获取页面标题,悬浮文本和错误文本,并验证?

  1. 标题,我们可以通过driver.getTitle()方法来得到一个字符串,然后使用字符串的containts方法或者equals方法去进行断言。

  2. 悬浮文本(tooltip),一般是利用Actions类,然后鼠标悬停方法,然后通过getText()方法来得到这个tooltip字符串。

  3. 错误信息,直接把这个错误字段先进行定位,然后通过getText()方法拿到错误文本,主要的断言有包含,相等,不相等,不包含,以什么开头等。

11. 怎么验证勾选框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?

  1. 通过以下方法来验证元素是enable 还是disableboolean

    enabled = driver.findElement(By.xpath(“元素定位表达式”)).isEnabled();

  2. 通过以下方法来验证元素是select/checkboolean

    checked = driver.findElement(By.xpath(“元素定位表达式”)).isSelected();

  3. 通过以下方法来验证元素是dispalyed还是not displayboolean

    displayed = driver.findElement(By.xpath(“元素定位表达式”)).isDisplayed();

12. 什么是页面加载超时

Selenium中有一个 Page Load wait的方法,有时候,我们执行脚本的速度太快,但是网页程序还有一部分页面没有完全加载出来,就会遇到元素不可见或者元素找不到的异常。为了解决问题,让脚本流畅的运行,我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);这行作用就是,如果页面加载超过10秒还没有完成,就抛出页面加载超时的异常。

13. 在日历这种web 表单你是如何处理的?

首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助javascript。还有些日历控件一个文本输入框,可以直接sendKeys()方法来实现传入一个时间的数据。

14. 如何去定位页面上动态加载的元素?

  1. 触发动态加载元素的事件,直至动态元素出现,进行定位

  2. 定位属性动态变化的元素?

    xpath 或者 css 通过同级、父级、子级进行定位点击链接以后, Selenium 是否会自动等待该页面加载完毕?会的

 

15.  怎么保证你要操作的元素一定是可以点击的?

  答:1)可能由于服务器性能较差,或者网速较慢等原因,导致元素暂时还未加载出来,元素此时无法点击。可以通过等待元素加载解决此问题(等待分三种:隐式等待,显式等待和强制等待,这里推荐显示等待,相对提高执行效率)。   

   2)元素定位没问题,但是元素太小,Selenium无法点击到元素的中心位置。此时可以通过往上面层级的方式,找到更大的元素中心点,此时就可以对元素进行点击。     

  3)当元素被遮挡,例如下拉框遮挡的元素,也会无法点击,并且报错。此时只需要点击页面的其他任意元素,使下拉框收回,遮挡元素便可以进行点击。   

   4)被点击的元素在可视范围之外时,元素也无法点击。此时可以通过操作滚动条来解决,Selenium中没有直接操作滚动条的方法,曲线救国又来了,可以通过执行javascript代码进行滚动条的操作。

    下面的代码是将元素向右滚动x像素点,向下滚动y个像素点,如果需要向左和向上滚动,x,y分别为负值即可。当然滚动条操作还有其他的方法,比如滚动到某个元素的位置等,具体大家可以自查。伪代码如下: driver.excuteScript("windows.scrollBy(x,y)");

  5)可以直接判断元素是否可以点击。 driver.findElement(By.id("")).isClickable();

16. 如何使用Selenium输入文本框?

  答:使用sendKeys(“XXXXXX”)在文本框中输入字符串,例如:

  WebElement username = drv.findElement(By.id(“电子邮件”));

  username.sendKeys(“ sth”);

17. 如何获取Web元素中的文本?

  答: Get方法用于获取指定Web元素内部文本,此方法不需要传递任何参数,直接调用即可,它返回的是字符串值。该方法常用于验证页面显示的消息,标签,错误信息等是否和预期匹配。

  String  Text = driver.findElement(By.id(“XXX”)).getText();

18. selenium中页面导航命令有哪些不同类型?

  答:Selenium中常见的页面导航操作如下:

  (1)navigate().back() – 回上一页,回到Web浏览器历史记录中的上一个网页。

  例:driver.navigate().back();

  (2)navigate().forward() – 去下一页, 基于浏览器的历史记录导航到下一个网页。

  例:driver.navigate().forward();

  (3)navigate().refresh() – 刷新当前页面。

  例:driver.navigate().refresh();

  (4)navigate().to() – 开启新的Web浏览器窗口,并导航到指定的URL。

  例:driver.navigate().to(“https://www.atstudy.com/”);

19.web测试中如何验证网页标题是否正确?

  A:可以结合junit/testNG中的断言。

  // 验证页面标题内容是否正确

  assertTrue(“验证当前页面标题正确性:”,driver.getTitle().equals(“预期页面标题内容”));

 

 

 

 

 

第三部分  :web框架

1. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第四部分  :其他

1. 什么是线程等待(硬式等待)

  如Thread.sleep(2000),webdriver线程强制休眠2秒钟,2秒过后,再执行后续的代码。

2. 什么是pollingEvery

#这个是设置个一段时间就去做一件事,例如下面设置隔一秒就去查找元素一次。
WebDriverWait wait = new WebDriverWait(driver,30);wait.pollingEvery(1, TimeUnit.SECONDS);driver.findElement(By.xpath(“xxxx”)); 

 

3. 如何处理“不受信任的证书”的问题?

例如,在登录12306网站的时候,如果你没有下载和安装过这个网站的根证书,那么你就会遇到打开12306网站提示证书不受信任的拦截页面。下面举例火狐和谷歌上处理这个问题的基本代码
火狐:

// 创建firefoxprofile FirefoxProfile profile=new FirefoxProfile(); // 点击继续浏览不安全的网站profile.setAcceptUntrustedCertificates(true);
// 使用带条件的profile去创建一个driver对象 WebDriver driver=new FirefoxDriver(profile); Chrome:

// 创建类DesiredCapabilities的对象DesiredCapabilities cap=DesiredCapabilities.chrome();
// 设置ACCEPT_SSL_CERTS 变量值为true cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); // 新建一个带capability的chromedriver对象 WebDriver driver=new ChromeDriver(cap);

 

分类:

技术点:

相关文章:

  • 2021-09-19
  • 2021-11-01
  • 2021-10-16
  • 2021-08-06
猜你喜欢
  • 2021-10-01
  • 2021-10-01
  • 2021-08-15
  • 2021-12-12
  • 2021-12-22
  • 2018-03-23
相关资源
相似解决方案