作者:hacker 日期:2022-09-20 分类:网站黑客
1、问题发生描述xpath定位元素实例:
从一个页面进行点击等操作xpath定位元素实例,页面跳转到第二个页面xpath定位元素实例,对第二个页面中xpath定位元素实例的元素xpath定位元素实例,采取任何措施定位都报错,问题报错点如下:
2、出现问题的原因:
窗口句柄还停留在上一个页面,对于当前新弹出的页面还没有定位,因此新页面的任何元素都定位不到
3、解决方案:
在新页面操作元素之前,需添加句柄操作,方式如下:
1、使用driver.current_window_handle #获取当前窗口句柄,添加此方法,仍报相同的错误,因此不能采用这种方式进行解决问题
2、使用driver.switch_to_window(driver.window_handles[1]),或者 driver.switch_to_window(self.driver.window_handles[-1]) ,两种方式中任选一种即可找到对应的元素
添加后的代码如下:
每天记录进步一点点.........
这样定位会报错。xpath是按照树xpath定位元素实例的层级一层一层识别元素。在uiautomatorviewerxpath定位元素实例,识别到的元素前缀都是从0开始xpath定位元素实例,而转换成xpath,是需要从1开始的,类似第一个层级,第二个层级
driver.findElementByXPath(
"//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.EditText[1]")xpath定位元素实例;
改写下定位元素到1,继续调试下
XPath 定位
第一个button
//div[@id="h"]/button
第二个button
//div[@id="s"]/button
定位到元素后 对象后面加.click()就是点击了
1.如果元素text是唯一的,可以通过text文本定位
//*[@text=’text文本属性’]
# 定位text
driver.find_element_by_xpath("//*[@text='扫一扫']").click()
2.如果元素id是唯一的,也可以id属性定位
//*[@resource-id=’id属性’]
# 定位 resource-id
driver.find_element_by_xpath("//*[@resource-id='com.taobao.taobao:id/tv_scan_text']").click()
同样可以联合上面两种方式定位,如下
# 也可以联合@resource-id属性和@text文本属性来下定位
driver.find_element_by_xpth("//*[@resource-id='com.taobao.taobao:id/tv_scan_text'][@text='扫一扫']").click()
3.class属性唯一的话,同样可以通过class属性定位,有两种方法
第一种: //class属性
# 定位搜索框 //class属性
driver.find_element_by_xpath("//android.widget.EditText").click()
第二种: //*[@class=’class属性’]
# 定位搜索框 //*[@class='ae05-1ff3-364f-6482 class属性']
driver.find_element_by_xpath("//*[@class='1ff3-364f-6482-033b android.widget.EditText']").click()
4.通过content-desc属性定位
//*[@content-desc=’desc的文本’]
复制代码
#点登录/注册
driver.find_element_by_xpath("//*[@text='注册/登录']").click()
time.sleep(3)
#content-desc定位
driver.find_element_by_xpath("//*[@content-desc='帮助']").click()
复制代码
contains模糊定位
1)、contains是模糊匹配的定位方法,对于一个元素的id或者text不是固定的,但有一部分是固定的,这种就可以模糊匹配。
定位页面元素主要有以下几种方法
//通过Id定位元素
WebElement element = driver.findElement(By.id(“id名"));
//通过name定位元素
WebElement element = driver.findElement(By.name(“name名"));
//通过xpath定位元素
WebElement element = driver.findElement(By.xpath(“xpath路径"));
//通过标签xpath定位元素实例的值定位元素
WebElement cheese = driver.findElement(By.linkText(“标签xpath定位元素实例的值"));
//通过classxpath定位元素实例的值定位元素
List list=driver.findElements(By.className(“class值"));
//通过标签名定位元素
List list = driver.findElements(By.tagName(“标签名"));
xpath定位方法详解:
1.xpath较复杂的定位方法:
//from[@id='login_from']dl/dt/input[@id='j_password']
或者写成 input[@id='j_password']'));
2.xpath的模糊定位方法:
a、用contains关键字定位:
driver.findElement(By.xpath('//a[contains(@href,'logout')]'));
b. 用start-with,定位代码如下:
driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));
c. 用Text关键字,定位代码如下:
driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
d.如果知道超链接元素的文本内容,也可以用
driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));
3.XPath 关于网页中的动态属性的定位,例如,ASP.NET 应用程序中动态生成 id 属性值,可以有以下四种方法:
//input[contains(@id,'crtl')]
//input[starts-with(@id,'crtl')]
//input[ends-with(@id,'crtl')]
//input[contains(text(),'退出')]
已有3位网友发表了看法:
访客 评论于 [2022-09-20 07:32:16] 回复
indow_handles[1]),或者 driver.switch_to_window(self.driver.window_handles[-1]) ,两种方式中任选一种即可找到对应的元素添加后的代码如下:每天记录进步一点
访客 评论于 [2022-09-20 15:26:15] 回复
v[@id="s"]/button定位到元素后 对象后面加.click()就是点击了xpath("android.widget.EditText[@index='7']").click()无法定位元素,而且用cla
访客 评论于 [2022-09-20 09:10:08] 回复
rLayout[1]/android.widget.EditText[1]")xpath定位元素实例;改写下定位元素到1,继续调试下pathon selenium爬虫里面如何定位一个button元素?XPath 定位第一个button //div[@id=