从webdriver获取html报错,webdriver 中使用JavaScript

selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。

一种常见的场景当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。滚动条是无法直接用定位工具来定位的。selenium里面也没有直接的方法去控制滚动条,这时候只能借助JS了,在开发者调试工具控制台中JS操作示例如下

ad3f92ed0c37

上述命令的意思是获取id值为nav_list的HTML元素,并获取其文本值。

有些特殊的操作selenium2+python无法直接完成的,JS刚好是这方面的强项,且selenium提供了一个操作js的方法,所以算是一个很好的补充(js脚本可以对当前页面(无论是否有滚动条或全屏展示)元素,都可以操作))。调用方法如下

execute_script(script, *args)

在当前窗口/框架 同步执行javaScript。括号中第一个script是str类型的JS脚步代码,第二个Arguments是该方法的参数同时也是JS脚步代码的参数。

常用示例如下

1、控制浏览器滚动条高度

#滚动条回到顶部

js="varq=document.documentElement.scrollTop=0"

driver.execute_script(js)

这里可以修改scrollTop的值,来控制右侧滚动条的位置,以上方法在Firefox上是可以的,但是用Chrome浏览器,发现不管用。于是用以下方法解决谷歌浏览器滚动条的问题。

js ="var q=document.body.scrollTop=0"

driver.execute_script(js)

若要对页面中的内嵌窗口中的滚动条进行操作,要先定位到该内嵌窗口,在进行滚动条操作

js="varq=document.getElementById('id').scrollTop=0"

driver.execute_script(js)

2、获取JS返回值

从javaScript代码中返回数据,我们需要使用return关键字。基于返回值的类型,我们需要对execute_script()方法进行转型。对于带小数点的值,使用Double类型,非小数值可以使用Long类型,布尔值可以使用Boolean类型,如果返回的是HTML节点,可以使用 WebElement类型;文本值,可以使用String类型。如果js处理后结果是列表形式,则返回结果可以直接用python列表的方法操作。

js="return

"+"window.document.getElementById('nav_list').text"

nav=driver.execute_script(js)

这时js语句中不应该出现var关键字及变量名了。直接返回语句。下列写法是错误的

js="return

"+" var txt=window.document.getElementById('nav_list').text"

nav=driver.execute_script(js)

js=" var txt=window.document.getElementById('nav_list').text;return

txt"

nav=driver.execute_script(js)

在引入变量做参数的时候,也别忘了参数要加引号,如

result_text=”开户申请提交成功”

result_js='return

'+'document.getElementById("applySuccess").innerText.includes("'+result_text+'")'

否则WebDriverException: Message: unknown error: 开户申请提交成功 is not defined。

由于使用js方法,执行速度比较快,页面也许没有完全加载,造成操作属性找不到的错误,如

WebDriverException: Message: unknownerror: Cannot read property 'innerText' of undefined

这时需要代码中增加显式等待。

3、给js传递参数

所传递的参数就是script执行时需要的参数,调用格式为

execute_script(script,参数1,参数2,参数3,…)

#实现给指定元素value赋新值

ele=driver.find_element_by_id('UserName')

printele

js="arguments[0].value=arguments[1]"printdriver.execute_script(js,ele,"100000000")  #ele就是第一个参数,js执行代码中用arguments[0]引用,“10000000”就是第二个参数,代码中用arguments[1]引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python appium执行APP自动化的时候,常见的报错之一是关于webdriver.Remote的。这个错误通常发生在以下代码行: ```python driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub/', desired_caps) ``` 这个错误的具体信息可能是: ```python Traceback (most recent call last): File "E:\Workplace\app test\login_test.py", line 22, in <module> driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub/', desired_caps) File "E:\Python27\lib\site-packages\appium\webdriver\webdriver.py", line 36, in __init__ super(WebDriver, self).__init__(command_executor, desired_capabilities, browser_profile, proxy, keep_alive) ``` 这个错误是由于缺少所需的Selenium客户端驱动程序引起的。Selenium客户端驱动程序是用于与Selenium服务器(Remote WebDriver)或本地Selenium WebDriver交互的库。 解决这个问题的方法是确保您已经正确安装了Selenium客户端驱动程序,并且与您使用的版本兼容。您可以通过在Python运行以下命令来安装所需的Selenium客户端驱动程序: ``` pip install selenium ``` 如果您已经安装了Selenium但仍然遇到这个错误,那么可能是因为您的Selenium版本与您的Appium或其他依赖项不兼容。您可以尝试升级或降级Selenium版本以解决这个问题。 另外,请确保您的Appium服务器正在运行,并且与您在代码指定的URL('http://127.0.0.1:4723/wd/hub/')匹配。如果Appium服务器未运行或URL不正确,也可能导致这个错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值