GVKun编程网logo

在Appium iOS中使用Selenium Webdriver选择器(selenium选择框)

12

针对在AppiumiOS中使用SeleniumWebdriver选择器和selenium选择框这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展appium,selenium,webdrive

针对在Appium iOS中使用Selenium Webdriver选择器selenium选择框这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展appium ,selenium ,webdriver 运行原理与机制、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、Selenium API-WebDriver 属性、Selenium API-WebDriver 方法等相关知识,希望可以帮助到你。

本文目录一览:

在Appium iOS中使用Selenium Webdriver选择器(selenium选择框)

在Appium iOS中使用Selenium Webdriver选择器(selenium选择框)

我正在进行的一个项目正在与ios应用程序同时开发一个Web应用程序(出于同一目的),我希望能够使用现有的Selenium测试,但是选择器遇到了麻烦。是否存在可用于Selenium
Webdriver和Appium
ios的选择器类型或属性名称,因此我可以将变量设置为浏览器或应用程序,并且它们可以在两者上运行并起作用。该项目中没有人以前使用过Appium,因此我们缺乏很多知识。

我尝试使用ID,发现ios无法使用ID,将其更改为名称,发现名称已从appium中删除。如果可能的话,我们希望使用一个选择器,该选择器在浏览器中应与应用程序中的相同。

谢谢

答案1

小编典典

您可以创建一个对象存储库文件,其中包含WebApp和iOS应用程序的定位器。然后,您必须按照以下过程

  1. 创建WebDriverAppiumDriver实例
  2. 使用相关的驱动程序来查找WebApp和iOS应用程序中的元素。我们可以在测试用例中同时使用两个驱动程序。

请注意,元素的方式WebDriverAppiumDriver标识将有所不同。例如,WebDriver如果使用来标识元素,则可以使用来ID类似地AppiumDriver标识元素findElementByAccessibilityId

即使AppiumDriver使用相同的逻辑WebDriver,方法名称也将不同。请找到所有使用的方法的链接AppiumDriver

希望这可以帮助。

appium ,selenium ,webdriver 运行原理与机制

appium ,selenium ,webdriver 运行原理与机制

 做测试开发的童鞋都知道,UI自动化你绕不开selenium, webdrvier, appium框架,那么这三者之间有什么关联,它们的原理是什么呢?

简单来说就是:

Selenium2  将浏览器原生的API封装成WebDriver API ,webdriver 是基于 http协议的;

appium是基于 webdriver 协议添加对移动设备自动化api扩展而成的,基于tcp/ip协议(使用了socket接口)

推论: 凡是牵扯到客户端和服务器交互的,都有Http 协议

   凡是牵扯到移动端社保的,都有tcp/ip 协议(封装成socket接口)

 

 

面试的时候如何口述Selenium 原理?

Selenium 是将各个浏览器的API封装成" Selenium自己设计定义的协议,名字叫做The WebDriver Wire Protocol " 的webdriver API 

操作层面:

1、测试人员编写UI自动化测试脚本(java,python等等),运行脚本后,程序会打开指定的webdriver浏览器

2. webdriver浏览器作为一个remote-server 接受脚本的命令,同时webservice会打开一个端口:http://localhost:46350  浏览器则会监听这个端口

2、webservice会将脚本语言翻译成json格式传递给浏览器执行操作命令

逻辑层面:

1、测试人员执行测试脚本后,就创建了一个session, 通过http 请求向webservice发送了restfull的请求。

2、webservice翻译restfull的请求为浏览器能懂的脚本,然后接受脚本执行结果。

3、webservice将结果进行封装--json 给到客户端client/测试脚本 ,然后client就知道操作是否成功,同时测试也可以进行校验了。

 

口述appium的原理:

appium-IOS 和安卓都差不多,有细小差别,分PC和手机两块讲:

1、首先是PC端, 测试人员执行测试脚本(java,python等脚本)通过appium client 转换为json格式传递给appium server

2、 appiumserver 启动了一个监听端口例如4724, 同时向手机端adb push 一个bootstrap.jar/bootstrap.js 的脚本,手机端通过该脚本同时监听端口4724

3、PC和手机端就通过这个端口实现了通信和交互,基于socket通信(一个封装了TCP/IP协议的接口)

4、手机端通过该端口传输的命令执行APP, bootstrap里面封装了安卓和苹果的自动化测试框架UIautomator(低版本的安卓是instrumentation ) 执行相应的命令

5、执行完操作后通过端口返回给PC端,PC端根据返回结果 json 做校验,同时也知道了操作是否执行成功

 

 

所以UI自动化的底层还是webdriver ,它是基于HTTP协议的,那么HTTP的原理是什么? 长连接短连接是什么意思,下个博客总结:

Selenium2 

Selenium是一个用于Web应用程序测试的工具,支持多平台、多浏览器、多语言去实现自动化测试,Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。

Webdriver的一个简单的架构图,如下图所示:

 

WebDriver的工作原理图:

在我们new一个WebDriver的过程:
1. Selenium首先会确认浏览器的native component是否存在可用而且版本匹配(selenium版本对应到 不同的浏览器driver版本)。
2.在目标浏览器里启动一整套Web Service(实际上就是浏览器厂商提供的driver, 比如IEDriver, ChromeDriver,它们都实现了 WebDriver''s wire protocol),
3.这套Web Service使用了Selenium自己设计定义的协议,名字叫做 The WebDriver Wire Protocol。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打 开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等等等。
 

WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如FirefoxDriver初始化成功之后,默认会从http://localhost:7055开始,而ChromeDriver则大概是http://localhost:46350之类的。接下来,我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做什么事情。

 

可以更通俗的理解:由于客户端脚本(java, python, ruby)不能直接与浏览器通信,这时候可以把WebService当做一个翻译器,它可以把客户端代码翻译成浏览器可以识别的代码(比如js).客户端(也就是测试脚本)创建1个session,在该session中通过http请求向WebService发送restful的请求,WebService翻译成浏览器懂得脚本传给浏览器,浏览器把执行的结果返回给WebService,WebService把返回的结果做了一些封装(一般都是json格式),然后返回给client,根据返回值就能判断对浏览器的操作是不是执行成功

 

举个实际的例子:

WebDriver diver = new FirefoxDriver();
driver.get("http://google.com");
 
在执行 driver.get("http://google.com");  这句代码时,client也就是我们的测试代码向Web Service(remote server)发送了如下的请求:
POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/url
post_data {"url":"http://google.com"} 
 
通过post的方式请求localhost:port/hub/session/session_id/url地址,请求浏览器完成跳转url的操作。
 
如果上述请求是可接受的,或者说Web Service是实现了这个接口,那么Web Service会跳转到该post data包含的url,并返回如下的response
{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}
 
该response中包含如下信息
name:Web Service端的实现的方法的名称,这里是get,表示跳转到指定url;
sessionId:当前session的id;
status:请求执行的状态码,非0表示未正确执行,这里是0,表示一切ok不必担心;
value:请求的返回值,这里返回值为空,如果client调用title接口,则该值应该是当前页面的title;
 
如果client发送的请求是定位某个特定的页面元素,则response的返回值可能是这样的:
{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}
 
name,sessionId,status跟上面的例子是差不多的,区别是该请求的返回值是ELEMENT:{2192893e-f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,通过该id,client可以发送如click之类的请求与server端进行交互。
 
 
 

APPIUM运行原理:

Appium是 c/s模式的
appium是基于 webdriver 协议添加对移动设备自化api扩展而成的
webdriver 是基于 http协议的,第一连接会建立个 session 会话,并通过 post发送一个 json 告知服务端相关测试信息

IOS 原理图

appium ios封装了 封装了 封装了 apple 的 Instruments 框架,主要用了 Instrument里的 UIAutomation(Apple  的自动化测试框架),然后在设备中注入  bootstrap.js 进 行监 听。
Client ent是我们编写的 webdriver脚本 ,中间是 appium启动 server (默认监听 4723 端口 ),
appium server  调用 instruments.js启动一个 socket server ,同时分出一个 子进程运⾏instruments.app 将 bootstrap.js(一个 UIAutomation 脚本)注 ⼊入到 devices⽤于和外界进行交 。
最后 Bootstrap.js将执行的结果返回给 将执行的结果返回给 appium server  ,appium server再将结果返回给 appium client 。

Android原理图

 

 4.2 以后是基于 uiautomator框架实现查找注入事件的, 框架实现查找注入事件的,框架实现查找注入事件的, 4.2 以前则是 instrumentation i框架的,并封装成一个叫 Selendroid 这玩意提供服务
Client ent是我们编写的 webdriver 脚本。中间是 appium启动 server  (默认监听  4723 端口 ),
appium server  会把请求转发给中间件 会把请求转发给中间件 Bootstrap.jar  ,它是用java写的,安装在手机上 .Bootstrap监听 4723端口并接收appium  的命令,最终通过调用 UiAutomator 的命令来实现。
Bootstrap将执行的结果返回给返回给 appium server 。
Appiumserver再将结果返回给 client端(PC)。

 

 

 

 

JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测

JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测

如何解决JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测?

从当前的实现开始,一种理想的访问网页而不被检测到的方法是使用ChromeOptions()该类向以下参数添加几个参数:

排除enable-automation开关的集合 关掉 useAutomationExtension 通过以下实例ChromeOptions

Java示例:

System.setProperty("webdriver.chrome.driver", "C:\\Utility\\browserDrivers\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
options.setExperimentalOption("useAutomationExtension", false);
WebDriver driver =  new ChromeDriver(options);
driver.get("https://www.google.com/");

Python范例

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option(''useAutomationExtension'', False)
driver = webdriver.Chrome(options=options, executable_path=r''C:\path\to\chromedriver.exe'')
driver.get("https://www.google.com/")

解决方法

我正在尝试使用selenium和铬在网站中自动化一个非常基本的任务,但是以某种方式网站会检测到铬是由selenium驱动的,并阻止每个请求。我怀疑该网站是否依赖像这样的公开DOM变量https://stackoverflow.com/a/41904453/648236来检测selenium驱动的浏览器。

我的问题是,有没有办法使navigator.webdriver标志为假?我愿意尝试修改后重新尝试编译selenium源,但是似乎无法在存储库中的任何地方找到NavigatorAutomationInformation源https://github.com/SeleniumHQ/selenium

任何帮助深表感谢

PS:我还从https://w3c.github.io/webdriver/#interface尝试了以下操作

Object.defineProperty(navigator,''webdriver'',{
    get: () => false,});

但是它仅在初始页面加载后更新属性。我认为网站会在执行脚本之前检测到变量。

Selenium API-WebDriver 属性

Selenium API-WebDriver 属性

打开浏览器,能够定位的内容都在 HTML 代码段内的 <body>页面内容</body> 中,对于浏览器上的当前页面标题,url等,都是无法通过元素定位来操作的。

故此,有特定的 WebDriver 属性来完成这一类的操作。

序号方法/属性描述
1driver.title获取当前页面的标题
2driver.current_url获取当前页面的链接地址
3driver.name获取浏览器名称
4driver.page_source获取当前页面源码
5driver.current_window_handle获取当前窗口句柄
6driver.window_handles获取当前窗口所有句柄

driver.title

获取当前页面的标题:

from selenium import webdriver

driver = webdriver.Chrome()  # 打开浏览器
driver.get("https://www.baidu.com/")  # 跳转至百度
title = driver.title  # 将当前页面的标题赋值给 title
print("当前网页标题是:{}".format(title))  # 当前网页标题是:百度一下,你就知道

driver.quit()  # 关闭浏览器

driver.current_url

获取当前页面的链接地址(url):

from selenium import webdriver

driver = webdriver.Chrome()  # 打开浏览器
driver.get("https://www.baidu.com/")  # 跳转至百度
url = driver.current_url  # 将当前页面的url赋值给 title
print("当前网页url是:{}".format(url))  # 当前网页url是:https://www.baidu.com/

driver.quit()  # 关闭浏览器

driver.name

获取浏览器名称:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("http://news.baidu.com/")  # 跳转至百度新闻
sleep(1)
name = driver.name  # 获取浏览器名
print(name)  # chrome
sleep(2)

driver.quit()  # 关闭浏览器

driver.page_source

获取当前页面源码:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("http://news.baidu.com/")  # 跳转至百度新闻
sleep(1)
source_code = driver.page_source  # 获取当前页面源码
print(source_code)  # 打印页面源码
sleep(2)

driver.quit()  # 关闭浏览器

driver.current_window_handle

获取当前窗口句柄:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("http://news.baidu.com/")  # 跳转至百度新闻
sleep(1)
window = driver.current_window_handle  # 获取当前窗口句柄
print(window)  # CDwindow-D66055B46A1AB87EB271834BB9EA96C7
sleep(2)

driver.quit()  # 关闭浏览器

driver.window_handles

获取当前窗口所有句柄:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("https://www.baidu.com/")  # 跳转至百度首页
sleep(1)
driver.find_element_by_xpath("//div[@id=''s-top-left'']/a[1]").click()
windows = driver.window_handles  # 获取当前窗口所有句柄
print(windows)  # [''CDwindow-14E173D7301CC5C7A70930B3F7AB734D'', ''CDwindow-3E3A9FC2536870107E4C9FF2DFAEA62E'']
sleep(2)

driver.quit()  # 关闭浏览器

总结

Selenium API-WebDriver 方法

Selenium API-WebDriver 方法

关于常用的 WebDriver 方法,主要是回退、前进、刷新关闭浏览器等

序号方法/属性描述
1driver.back()浏览器页面后退
2driver.forword()浏览器页面前进
3driver.refresh()刷新当前浏览器页面
4driver.maximize_window()使浏览器窗口最大化
5driver.set_window_size()设置浏览器窗口为指定尺寸
6driver.close()关闭当前窗口
7driver.quit()退出浏览器

driver.back()

浏览器页面后退:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("https://juejin.im/")  # 跳转至掘金首页
sleep(1)
driver.find_element_by_xpath("//a[@href=''/topics'']").click()  # 跳转至话题页面
sleep(2)
driver.back()  # 浏览器页面回退
sleep(2)

driver.quit()  # 关闭浏览器

driver.forword()

浏览器页面前进:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("https://juejin.im/")  # 跳转至掘金首页
sleep(1)
driver.find_element_by_xpath("//a[@href=''/topics'']").click()  # 跳转至话题页面
sleep(2)
driver.back()  # 浏览器页面回退
sleep(2)
driver.forward()  # 浏览器页面前进
sleep(2)

driver.quit()  # 关闭浏览器

driver.refresh()

刷新当前浏览器页面:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("http://news.baidu.com/")  # 跳转至百度新闻
sleep(1)
driver.refresh()
sleep(2)

driver.quit()  # 关闭浏览器

driver.maximize_window()

使浏览器窗口最大化

driver.set_window_size()

设置浏览器窗口为指定尺寸:

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("http://news.baidu.com/")  # 跳转至百度新闻
sleep(1)
driver.set_window_size(1000, 600)  # 设置浏览器窗口的宽*高=1000*600
sleep(2)

driver.quit()  # 关闭浏览器

driver.close()

此方法用于关闭当前窗口,如果浏览器打开了多个窗口,只会关闭当前的一个窗口,浏览器不会被关闭。

driver.quit()

此方法与 driver.close() 的区别在于,无论当前打开了多少个窗口,它会直接退出浏览器。

总结

我们今天的关于在Appium iOS中使用Selenium Webdriver选择器selenium选择框的分享已经告一段落,感谢您的关注,如果您想了解更多关于appium ,selenium ,webdriver 运行原理与机制、JavaSelenium Webdriver:修改navigator.webdriver标志以防止selenium检测、Selenium API-WebDriver 属性、Selenium API-WebDriver 方法的相关信息,请在本站查询。

本文标签: