文章导读:
- 1、python自动化执行时,定位下拉框中值,不在当前的form中,如何定位,请指教?
- 2、python怎么定位富文框textarea的元素?我用xpath定位包找不到元素
- 3、selenium+python 自动化测试,下面页面中元素如何定位,我试了很多方法都不行
- 4、python-appium提示无法定位元素,添加uiautomator2后运行报错
- 5、python+selenium 怎么处理display:none 元素隐藏起来了,不能定位到啊
- 6、selenium+python定位问题
python自动化执行时,定位下拉框中值,不在当前的form中,如何定位,请指教?
1. 个别情况下用到Actionchain的悬停功能,使下拉框展开,才能定位到到页面的元素。
2. 一般用到Select,有三种方式实现下拉框内容的选择,任选其一。定位元素时,要先定位到下拉菜单,而不是直接定位下拉菜单里面的选项,示例如下:
from selenium import webdriver
from selenium.webdriver.support.select import Select
driver = webdriver.Chrome()
# 根据索引选择(索引要字符串格式)
Select(driver.find_element_by_id("id_name")).select_by_index("2")
# 根据value值选择
Select(driver.find_element_by_id("id_name")).select_by_value("值")
# 根据文本值选择
Select(driver.find_element_by_id("id_name")).select_by_visible_text("文本内容")
driver.quit()
python怎么定位富文框textarea的元素?我用xpath定位包找不到元素
selenium,一个有效的自动化测试工具,我主要介绍下关于如何封装WebDriver,为一个比较轻松上手的自动化测试埋下铺垫
工具/原料
selenium-server-standalone-2.39.0.jar软件包
方法/步骤
先了解下什么是WebDriver
熟悉WebDriver的关于JAVA的一些API的使用
介绍一个火狐的插件firepath
我做的自动化测试是在火狐上运行的,因为我找到一个对于自动化测试比较有帮助的插件,那就是firepath,具体用法,就是先安装该插件,它会在firebug那么调试的窗口最右边出现。firepath截图和firepath安装后的截图如下所示。(优点:点哪个元素,哪个元素的xpath路径立马显示,看图吧)
自己封装的WebDriver的API方法
package com.qiang.data;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
/**
* WebDriver帮助类
*/
public class WebDriverUtil {
/**
* 写在前面的话:
* 我写的这个WebDriver帮助类法仅仅针对于xpath访问的
* 为什么这么写呢?有两点理由
* 其一:xpath获取方便,我用的是firefox浏览器,只要用firepath这个插件,我们就可以正确的定位到每一个节点,并且firepath支持查询功能,值得大家使用
* 其二:使用统一的xpath,给编码带来了一定的规范
*/
/**
* 没有验证码的的登录
* @param wd WebDriver对象
* @param unameXpath 用户名的xpath路径
* @param uname 用户名
* @param pwdXpath 密码xpath路径
* @param pwdValue 密码
* @param loginBtnXpath 登录按钮xpath
*/
public static void login(WebDriver wd,String url,String unameXpath,String uname,String pwdXpath,String pwd,String loginBtnXpath){
wd.get(url);
inputs(wd,unameXpath,uname);
inputs(wd,pwdXpath, pwd);
click(wd,loginBtnXpath);
}
/**
* 登录可能放在一个frame里了:我是因为遇到过,所以才加了个方法的
* @param wd WebDriver对象
* @param unameXpath 用户名的xpath路径
* @param uname 用户名
* @param pwdXpath 密码xpath路径
* @param pwdValue 密码
* @param loginBtnXpath 登录按钮xpath
* @param frame 第几个框架
*/
public static void loginFrame(WebDriver wd,String url,String unameXpath,String uname,String pwdXpath,String pwd,String loginBtnXpath,int frame){
wd.get(url);
wd.switchTo().frame(frame);
inputs(wd,unameXpath,uname);
inputs(wd,pwdXpath, pwd);
click(wd,loginBtnXpath);
}
/**
* 有验证码的登录
* @param wd WebDriver对象
* @param unameXpath 用户名的xpath路径
* @param uname 用户名
* @param pwdXpath 密码xpath路径
* @param pwdValue 密码
* @param loginBtnXpath 登录按钮xpath
* @param seconds 输入验证码的间隔
*/
public static void loginVerify(WebDriver wd,String url,String unameXpath,String uname,String pwdXpath,String pwd,String loginBtnXpath,int seconds){
wd.get(url);
inputs(wd,unameXpath,uname);
inputs(wd,pwdXpath, pwd);
try {
Thread.sleep(seconds*1000); //这段时间内请输入验证码
} catch (InterruptedException e) {
e.printStackTrace();
}
click(wd,loginBtnXpath);
}
/**
* 获取页面单个元素
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static WebElement getElement(WebDriver wd,String xpath){
return wd.findElement(By.xpath(xpath));
}
/**
* 获取页面的一组元素
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static ListWebElement getElements(WebDriver wd,String xpath){
return wd.findElements(By.xpath(xpath));
}
/**
* 获取元素节点的文本值
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static String getText(WebDriver wd,String xpath){
return wd.findElement(By.xpath(xpath)).getText();
}
/**
* 获取元素节点的文本值
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return 没有找到该元素时会有个提示,并且不会报错,建议使用
*/
public static String getExistText(WebDriver wd,String xpath){
if(isExist(wd, xpath)){
return getText(wd, xpath);
}
return "-1";
}
/**
* 获取元素节点的属性值
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @attribute 要获取目标节点的哪个属性
* @return
*/
public static String getAttribute(WebDriver wd,String xpath,String attribute){
return wd.findElement(By.xpath(xpath)).getAttribute(attribute);
}
/**
* 点击节点
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static void click(WebDriver wd,String xpath){
wd.findElement(By.xpath(xpath)).click();
}
/**
* 输入文本
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static void inputs(WebDriver wd,String xpath,String value){
wd.findElement(By.xpath(xpath)).sendKeys(value);
}
/**
* 判断是否选中
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static boolean isChecked(WebDriver wd,String xpath){
return wd.findElement(By.xpath(xpath)).isSelected();
}
/**
* 判断是否可用
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static boolean isEnabled(WebDriver wd,String xpath){
return wd.findElement(By.xpath(xpath)).isEnabled();
}
/**
* 判断是否存在元素
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
* @return
*/
public static boolean isExist(WebDriver wd,String xpath){
try{
wd.findElement(By.xpath(xpath));
return true;
}catch (NoSuchElementException e) {
return false;
}
}
/**
* 选中复选框,其实和点击一样,只是重新起了个名字
* @param wd WebDriver对象
* @param xpath 目标节点的xpath
*/
public static void check(WebDriver wd,String xpath){
click(wd, xpath);
}
/**
* 点击那种隐藏的下拉框
* @param wd WebDriver对象
* @param xpath1 事件源节点的xpath
* @param xpath2 目标节点的xpath
*/
public static void clickHidden(WebDriver wd,String xpath1,String xpath2){
click(wd, xpath1);
click(wd, xpath2);
}
/**
* 获取隐藏的文本,原理同上
* @param wd WebDriver对象
* @param xpath1 事件源节点的xpath
* @param xpath2 目标节点的xpath
*/
public static void getHiddenText(WebDriver wd,String xpath1,String xpath2){
click(wd, xpath1);
getText(wd, xpath2);
}
/**
* 获取隐藏节点的属性值
* @param wd WebDriver对象
* @param xpath1 事件源节点的xpath
* @param xpath2 目标节点的xpath
* @param attribute 要获取目标节点的哪个属性
*/
public static String getHiddenAttribute(WebDriver wd,String xpath1,String xpath2,String attribute){
click(wd, xpath1);
return getAttribute(wd, xpath2, attribute);
}
/**
* 切换窗口
* @param wd WebDriver对象
* @param title 要切换窗口的标题
*/
public static void changeWindow(WebDriver wd,String title){
String current = wd.getWindowHandle();
SetString all = wd.getWindowHandles();
IteratorString iterator = all.iterator();
while (iterator.hasNext()) {
String handle = iterator.next();
if(handle.equals(current)){
continue;
}
else{
wd.switchTo().window(handle);
if(wd.getTitle().contains(title)){
System.out.println("窗口成功跳转");
break;
}
else{
continue;
}
}
}
}
}
5
个人小结
以上基于WebDriver简单的封装在一定程度上可以减少代码量,封装得太少,看到的你根据自己的需要进行扩充吧,我个人特点是喜欢封装一切可以复用的代码,以便达到高效率的编码,并不是说会编码就够了,多总结总结还是会让自己的编码路不会走的那么崎岖些
selenium+python 自动化测试,下面页面中元素如何定位,我试了很多方法都不行
1.框架搭建
1.1 将struts2中的jar文件导入到项目中
commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar,freemarker-2.3.15.jar,ognl-2.7.3.jar
struts2-core-2.1.8.1.jar,xwork-core-2.1.6.jar
1.2 将struts.xml文件拷贝到项目的src目录下
1.3 修改web.xml文件
添加:
filter
filter-namestruts2/filter-name
filter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class
/filter
filter-mapping
filter-namestruts2/filter-name
url-pattern/*/url-pattern
/filter-mapping
2.action中方法的调用方式
2.1 自动方法调用(只能调用execute)
2.2 指定方法调用(通过设置action标签中的method属性)
2.3 动态方法调用(在调用时,在action后加!方法名称,如:login!deletUser)
注意:constant name="struts.enable.DynamicMethodInvocation" value="true" /
2.4 通配符调用
3. action接收客户端参数的方式
3.1 直接在action中定义参数变量,并生成set和get方法
3.2 定义接收参数的类
注意:都要为action的成员变量提供get和set方法
3.3 让action实现ModelDriven接口,并实现里面的getModel方法
4.获取request,session,application的方式
4.1 用ActionContext获取,实际上获取到的都是Map对象
4.2 用ServletActionContext获取,获取到的是基于Servlet API的对象
4.3 让action实现RequestAware,SessionAware,ApplicationAware接口,并实现里面的方法
5.四种转向
5.1 action转发到页面(默认)
5.2 action重定向到页面 result type="redirect"
5.3 action转发到action result type="chain"
param name="actionName"login/param
param name="nameSpace"/login/param
param name="method"login/param
/result
5.4 action重定向到action result type="redirectAction"login/result
python-appium提示无法定位元素,添加uiautomator2后运行报错
首先 npm install appium-uiautomator2-driver 目前装的是最新版2.37 但是发现与android 的chrome不匹配 然后就下载了 2.36的
chromedriver 版本对应关系 url
然后再次运行 果然又报错 那就继续找原因
python+selenium 怎么处理display:none 元素隐藏起来了,不能定位到啊
调用js方法:
driver.execute_script("arguments[0].click();", 元素位置))
例如:
driver.execute_script("arguments[0].click();", driver.find_element_by_xpath("/html/body/header/div/ul/li[4]/div/div[2]/ul/li[1]/a"))
selenium+python定位问题
首先,没有定位上的话,你要 确保页面又没嵌套的iframe,然后你的元素不是在iframe里面选的,不然你的定位不准确
e 用户名* @param pwdXpath 密码xpath路径* @param pwdValue 密码* @param loginBtnXpath 登录按钮xpath*/public static void login(WebDriver wd,String url,String u
d WebDriver对象* @param xpath 目标节点的xpath* @attribute 要获取目标节点的哪个属性* @return*/public static String getAttribute(WebDriver wd,String
uname,String pwdXpath,String pwd,String loginBtnXpath,int frame){wd.get(url);wd.switchTo().frame(frame);input