背景:之前由于自己有编写CefSharp.WinForms 窗体版以及 接口化 WCF+CefSharp.WinForms的网站版本,但是由于某些原因,延伸出Selenium学习与研究

总结:selenium特点是在做自动化测试,如果公司需要自动化测试是个不错的选择,开发语言包含很多。你完全可以使用自己熟悉的语言进行开发,请查看 https://docs.seleniumhq.org/docs/ 通过几天的摸索,个人比较还是建议大家最后部署在windows平台,linux平台由于缺少可视化,在调试的时候会有很多坑。

1.C#调用selenium

  请参照 http://www.mamicode.com/info-detail-2746933.html

  1、我们新建一个C#控制台程序

  2、使用Nuget搜索以下依赖库

  需要引用的核心库是Selenium.RC,Selenium.Support,Selenium.WebDriver

   MvcWeb版也可以运行,挂在IIS可以很好运行

using OpenQA.Selenium;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc; namespace Maxiot.ResourceServer.Controllers
{
public class TestController : Controller
{
//
// GET: /Test/ public ActionResult Index()
{
return View();
} /// <summary>
/// 获取数据
/// </summary>
/// <param name="accesstoken"></param>
/// <param name="value">非空参数必须传入数据</param>
/// <returns></returns>
public JsonResult GetData()
{
try
{
using (IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver())
{
driver.Navigate().GoToUrl("www.baidu.com");
var timeouts = driver.Manage().Timeouts();
Thread.Sleep();
var source = "aaa" + driver.PageSource;
return Json(source, JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{ return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
}
}

2.Java调用selenium

使用Maven导入包

<!-- selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<!-- <version>3.4.0</version>-->
</dependency>
package com.example.demoselenium.controller;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import java.awt.event.KeyEvent;
import java.rmi.ServerException;
import java.security.Key;
import java.util.Arrays;
import java.util.List; @RestController
@RequestMapping("/api/common/")
public class CommonController { @RequestMapping(value = "selenium/OpenChrome", consumes = "application/json", method = RequestMethod.GET)
public String getOpenChrome() throws ServerException {
String restResult = "aaaa";
try {
//设置属性,通过https://sites.google.com/a/chromium.org/chromedriver/下载对应驱动,如果是linux部署需要下载linux对应驱动
//System.setProperty("webdriver.chrome.driver", "chromedriver"); //linux设置,
//System.setProperty("webdriver.chrome.driver", "D:\\Program Files (x86)\\chromedriver_win32\\chromedriver.exe");
ChromeOptions a = new ChromeOptions();
a.addArguments("--no-sandbox");
a.addArguments("--disable-dev-shm-usage");
//a.addArguments("window-size=1920x3000"); //指定浏览器分辨率
a.addArguments("--disable-gpu"); //谷歌文档提到需要加上这个属性来规避bug
//a.addArguments("--hide-scrollbars"); //隐藏滚动条, 应对一些特殊页面
//a.addArguments("blink-settings=imagesEnabled=false"); //不加载图片, 提升速度
a.addArguments("--headless"); //浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
WebDriver driver = new ChromeDriver(a);
driver.get("http://dpmysql1:802/#/login");
//如果网页加载不出来的话,get需要加载的时候会至少5秒
String title = driver.getTitle();
restResult += "title:" + title;
//加载不成功,title的就是Ip,可以通过延时时间+title判断是否加载成功
String dataSoruce = driver.getPageSource();
restResult += "dataSource:" + dataSoruce;
Thread.sleep(5000); //等待跳转加载
WebElement account = driver.findElement(By.id("account"));
if (account != null) {
account.sendKeys("datamanager");//输入账号
String strAccount = account.getAttribute("value");
restResult += "account:" + strAccount;
}
WebElement password = driver.findElement(By.id("password"));
if (password != null) {
password.sendKeys("123");//输入账号
String strPassword = password.getAttribute("value");
restResult += "password:" + strPassword;
}
WebElement btn = driver.findElement(By.xpath("//*[@id='app']/form/div/div[6]/div/button"));
if (btn != null) {
btn.click(); //登录
restResult += "btn:点击登入系统";
} Thread.sleep(10000); //等待跳转加载
dataSoruce = driver.getPageSource();
String url = driver.getCurrentUrl(); //获取登录后的新窗口的url
if (url.equals("http://dpmysql1:802/#/newhome")) { //登录成功
//driver.findElement(By.xpath("//*[@id='app']/div/section/section/div[3]/div[1]/span")).click(); //点击按钮
//driver.findElement(By.xpath("//*[@id=\"app\"]/div/section/section/div[3]/div[2]/ul[1]/li[2]/a")).click(); //点击按钮
//driver.findElement(By.xpath("//*[@id=\"app\"]/div/div/section/div[1]/div/div/div[2]/div/div[2]/div/div[1]/div/div[4]/div[2]/table/tbody/tr[6]/td[10]/div/i[1]")).click(); //点击按钮
restResult += "成功"; } else {
//失败
//String message = driver.findElement(By.xpath("//*[@id=\"app\"]/form/div/div[5]/div[2]/p")).getText();
//System.out.println("*******" + message);
restResult += "失败" + url + "--" + dataSoruce + "失败";
}
//加载不成功,title的就是Ip,可以通过延时时间+title判断是否加载成功
System.out.printf(title);
System.out.println("*******");
driver.close(); return restResult;
} catch (Exception e) { return restResult + "错误" + e.getMessage();
} } /**
*
* @param driver 浏览器驱动
* @param xpath xpath定位表达式
*/
public static void javaScriptClick(WebDriver driver, String xpath) {
WebElement element = driver.findElement(By.xpath(xpath));
try{
if(element.isEnabled() && element.isDisplayed()){
System.out.println("使用JS进行也面元素单击");
//执行JS语句arguments[0].click();
((JavascriptExecutor) driver).executeScript("arguments[0].click();", element);
}else {
System.out.println("页面上元素无法进行单击操作");
}
}catch (StaleElementReferenceException e){
System.out.println("页面元素没有附加在页面中" + Arrays.toString(e.getStackTrace()));
}catch (NoSuchElementException e){
System.out.println("在页面中没有找到要操作的元素" + Arrays.toString(e.getStackTrace()));
}catch (Exception e){
System.out.println("无法完成单击操作" + Arrays.toString(e.getStackTrace()));
}
} }

Linux运行selenium

1.需要在Linux上面安装Chrome 参考 https://www.cnblogs.com/z-x-y/p/9506941.html

1、安装chrome

用下面的命令安装最新的 Google Chrome

yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
也可以下载到本地再安装
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
yum install ./google-chrome-stable_current_x86_64.rpm
安装必要的库
yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts

2、安装 chromedriver

chrome官网 wget https://chromedriver.storage.googleapis.com/2.38/chromedriver_linux64.zip
淘宝源(推荐)
wget http://npm.taobao.org/mirrors/chromedriver/2.41/chromedriver_linux64.zip

  将下载的文件解压,放在如下位置

  unzip chromedriver_linux64.zip

/usr/bin/chromedriver

  给予执行权限

chmod +x /usr/bin/chromedriver

目前Java编写的测试脚本在linux上面运行还是有些问题,比如登录按钮事件在windows上面可以触发,Linux失败,暂时我打算在去研究下Python

java代码下载:https://pan.baidu.com/s/1lnJXK__A8ZcIl3oVJyFC9w

Python 编写 selenuim

安装相应的环境:  可到官网下载最新版本 Python

       工具:    我选择Pycharm

配置环境path环境变量,为了方便命令执行,请配置

     

cmd查看python版本,如果命令无效,就可能是安装或环境变量未配置成功

  安装selenium

  

  查看安装的selenium

如果实在cmd配置不好就使用cmd命令行 cd 进入python安装目录下的script文件夹下,使用pip install selenium

  

我的PyCharm不能识别pip install selenium 安装的 selenium 我选择在PyCharm进行安装

代码阶段

import selenium.webdriver
from time import sleep #实例化对象
driver=selenium.webdriver.Chrome()
try:
#设置链接
driver.get("http://10.60.136.145:802/#/login")
sleep(3) #间隔3秒钟
title = driver.title #获取网页标题
dataSoruce = driver.page_source #获取网页资源
account = driver.find_element_by_id("account") #获取账号
if not account is None:
account.send_keys("datamanager") #设置账号 password = driver.find_element_by_id("password")
if not password is None:
password.send_keys("") btn=driver.find_element_by_xpath("//*[@id='app']/form/div/div[6]/div/button")
if not btn is None:
btn.click()
except:
print("出错")
finally:
driver.close()

代码执行后会自动运行谷歌浏览器,并打开设置的网址,然后进行账号和密码登录

selenium开发-C#/java/Python的更多相关文章

  1. 编程开发(C/C++&Java&Python&JavaScript&Go&PHP&Ruby&Perl&R&Erlang)

    使用Docker快速部署主流编程语言的开发.编译环境及其常用框架,包括C.C++.Java.Python.JavaScript.Go.PHP.Ruby.Perl.R.Erlang等. 在今后采用编程语 ...

  2. 芒果TV招聘研发工程师(JAVA PYTHON),地点长沙

    长沙芒果TV招聘高级 JAVA Python 工程师,工作地点:湖南广电   有兴趣的邮件0xmalloc@gmail.com; zealotyin@qq.com 公司有一大批从北京上海一线互联网企业 ...

  3. python开发:初识python

    python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...

  4. Python运维开发:初识Python(一)

    一.Pythton简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  5. 【Hbase三】Java,python操作Hbase

    Java,python操作Hbase 操作Hbase python操作Hbase 安装Thrift之前所需准备 安装Thrift 产生针对Python的Hbase的API 启动Thrift服务 执行p ...

  6. Python开发 第一篇 python的前世今生

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  7. V语言横空出世,C/C++/Java/Python/Go地位不保

    V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...

  8. Python服务器开发一:python基础

    Python服务器开发一:python基础   Python(蟒蛇)是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平 ...

  9. Python全栈开发:初识Python

    Pythton简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语 ...

随机推荐

  1. am335x system upgarde ddr3 capacity configuration base on TI DDR3 Software Leveling Tool (二十)

    follow test is  use ti DDR Software Leveling op log. AM335x DDR3 Software Leveling -- Version: Beta ...

  2. 括号序列的dp问题模型

    括号序列的dp问题模型 Codeforces314E ◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或 右括号使得该括号序列合法,求方案总数. ◦例如(())与()()都是合法的括号 ...

  3. 人脸检测之Haar-like,Adaboost,级联(cascade)

    最新版本整理完毕,见: http://face2ai.com/MachineLearning-Haar-like-Adaboost-cascade 0:写在前面的话           写在前面的牢骚 ...

  4. Linux之GDB命令(二)

    gdb命令: 前提条件:可执行文件必须包含调试信息 gcc -g gdb 文件名 –启动gdb调试 查看代码命令   当前文件:     list 行号(函数名)   指定文件:     list 文 ...

  5. 在windows使用gvim的感受

    用新下载的gvim写几行代码习惯一下,感觉vim用起来要比atom占用的内存少多了,更加的便捷.由于之前一直在用sublime text2,虽然我也很喜欢ST,但我还是抱着膜拜的心态来试了试gvim, ...

  6. Flask-特殊的装饰器

    视图函数中的装饰器 -----------------------视图中的装饰器---------------------- 1.如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route ...

  7. UVA 247 Calling Circles —— (强连通分量模板题)

    第一个强连通分量的题. 题意:有一堆人,a给b打电话表示a有一条向b的边,一个强连通分量代表一个电话圈,把每个电话圈里的人在一行内输出出来. 直接上模板即可,但是要注意把string用map映射一下的 ...

  8. mysql 5.7.16 安装配置

    环境变量在path中添加一个 E:\soft\mysql-5.7.16-winx64\mysql-5.7.16-winx64\bin 查看mysql版本mysql -V 生成无密码账户进入到mysql ...

  9. 队列(Java实现)

    队列的特点是先进先出. 基于链表的队列 public class LinkedListQueue<Item> { private Node first; // 指向最早添加进队列的元素 p ...

  10. ora-01578

    SQL> exec DBMS_STATS.GATHER_DATABASE_STATS; BEGIN DBMS_STATS.GATHER_DATABASE_STATS; END; * ERROR ...