python无法定位的元素属性_python怎么定位元素

hacker|
118

文章导读:

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里面选的,不然你的定位不准确

3条大神的评论

  • avatar
    访客 2022-12-26 上午 07:03:23

    e 用户名* @param pwdXpath 密码xpath路径* @param pwdValue 密码* @param loginBtnXpath 登录按钮xpath*/public static void login(WebDriver wd,String url,String u

  • avatar
    访客 2022-12-25 下午 10:54:46

    d WebDriver对象* @param xpath 目标节点的xpath* @attribute 要获取目标节点的哪个属性* @return*/public static String getAttribute(WebDriver wd,String

  • avatar
    访客 2022-12-25 下午 09:14:51

    uname,String pwdXpath,String pwd,String loginBtnXpath,int frame){wd.get(url);wd.switchTo().frame(frame);input

发表评论