web页面-JS/DOM/BOM/窗口滚动/修改内容/上传文件

1.什么是JavaScript及简单编写JS代码

前端工程师学的编程语言(HTML,CSS,JavaScript,Vue)

JavaScript 负责页面的动作,跳转等动态化的效果

Vue不是编程语言,只是JavaScript的一种框架而已

为什么前端开发要学JavaScript,因为所有的浏览器都内置安装了JavaScript的运行环境

下面我们来看一下如何编写简单的JS代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>py44</title>
</head>
<body>
<!--    标题-->
<h2>hello</h2>
<form>
    <!--    下拉框-->
    <select name="myselect">
        <option>选项1</option>
        <option>选项2</option>
        <option>选项3</option>
    </select>
</form>
<!--js脚本-->
<script>
    alert('hello!')
    // 相当于python中的print
    console.log('hello!')
    // 定义变量
    var name = 'Mara'
    console.log(name)
    let lastname = 'wang'
    console.log(lastname)
    // if
    let age = 18
    if (age >= 10) {
        console.log('已成年')
    } else {
        console.log('未成年')
    }
    // 函数
    function run() {
        console.log('run')
    }
    run()
</script>
</body>
</html>

运行结果:

在网页是看不到JS代码输出的内容,要按F12,在console下查看输出内容

一门编程语言的东西还是很多的,也没有那么容易学会的,具体的可以参考各种网站上学习 JavaScript 实例 | 菜鸟教程

2.DOM对象

DOM是文档对象模型

HTML这些标签归根结底就是字符串,不方便被程序访问和控制,因此浏览器通过DOM这种方式把文档转化成了对象,方便程序进行访问。

现在我们通过F12打开浏览器的控制台,对打开的网页进行一些简单的DOM操作。在控制台当中输入document,浏览器当中将会显示整个HTML标签内容,输入document.body显示打开页面的整个body标签。

这样通过DOM面向对象的编程方式能非常方便的获取到想要的元素,也能非常方便的执行浏览器操作。

document 是DOM对象下面的一个东西,document 不能直接说就是DOM

具体操作如下:

 总结:DOM就是通过JS控制浏览器当中的页面行为

3.BOM对象

BOM是浏览器对象模型

提供了独立于内容而与浏览器窗口进行交互的对象。描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏中的文本,对Cookie的支持,IE还扩展了BOM,加入了ActiveXObject类,可以通过js脚本实例化ActiveX对象等

BOM和DOM的主要区别:

  • BOM的最根本对象是window,BOM和浏览器关系密切。浏览器的很多东西可以通过JavaScript控制的,例如打开新窗口、打开新选项卡(标签页)、关闭页面,把网页设为主页,或加入收藏夹等这些涉及到的对象就是BOM
  • DOM最根本对象是document(实际上是window.document)DOM和文档有关,这里的文档指的是网页,也就是HTML文档。网页是由服务器发送给客户端浏览器的,无论用什么浏览器,接收到的HTML都是一样的,所以DOM和浏览器无关

接着我们就要用python代码中的selenium来控制JS来进行页面操作

4.打开新窗口

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            # selenium发送JS(window.open())代码给浏览器操作
            browser.execute_script("window.open()")
            time.sleep(5)

运行结果:

5.窗口滚动

具体代码如下:

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.get('https://readhub.cn/topics')
            js = 'window.scrollTo(0,document.body.scrollHeight)'
            browser.execute_script(js)
            time.sleep(5)

还有一种页面是整个窗口有个滚动条,页面里边列表也有滚动条,如下图:

 先定位列表整个元素,然后控制页面中列表进行滚动

代码具体如下:

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.maximize_window()
            browser.get('https://drafts.csswg.org/cssom-view/#common-infrastructure')
            js = 'document.getElementById("toc").scrollTo(0,document.body.scrollHeight)'
            browser.execute_script(js)
            time.sleep(5)

如果想滚动1/2那就这么写:scrollTo(0,document.body.scrollHeight/2)

如果想滚动1/4那就这么写:scrollTo(0,document.body.scrollHeight/4)

6.修改元素状态

如下图,要修改12306页面当中的出发日期

 具体代码如下:

第一种方法:所有的定位元素,修改值都通过js代码编写

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.maximize_window()
            browser.get('https://www.12306.cn/index/')
            # js代码单行编写
            # js = 'el = document.getElementById("train_date");el.value="2021-12-16"'
            # js代码单行编写
            js = '''
            el = document.getElementById("train_date")
            el.value="2021-12-16
            '''
            browser.execute_script(js)
            time.sleep(5)

第二种方法:使用selenium定位元素,通过js代码修改值

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.maximize_window()
            browser.get('https://www.12306.cn/index/')
            el = browser.find_element('id', 'train_date')
            # arguments[0]表示一个占坑符
            js = 'arguments[0].value="2021-12-16"'
            # execute_script后面可以跟多个参数,只要对应的索引号正确即可
            browser.execute_script(js, el, el, el)
            time.sleep(5)

7.文件上传

  • input类型,直接使用send_key()
import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.maximize_window()
            browser.get('file:///E:/lemon/lianxi/day33_selenuim/demo.html')
            el = browser.find_element('name', 'file')
            el.send_keys(r'E:\lemon\lianxi\day33_selenuim\2.png')
            time.sleep(5)

  •  js类型:需要用到系统原生的组件,所有的拖动上传都会有一个隐藏的input标签,如果无法定位,先通过js修改,再定位

import time

from selenium.webdriver import Chrome


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.implicitly_wait(5)
            browser.maximize_window()
            browser.get('https://image.baidu.com/')
            # querySelector是查看CSS方式定位元素
            js = '''el = document.querySelector('input[type="file"]');el.style='';'''
            browser.execute_script(js)
            element = browser.find_element('xpath', '//input[@type="file"]')
            element.send_keys(r'E:\lemon\lianxi\day33_selenuim\2.png')
            time.sleep(5)
  • 通过系统打开框上传文件
  1. windoss平台--pywinauto
  2. 跨平台(所有系统都可以)-- pyautoui

pywinauto:

安装这个第三方库时,要注意安装0.6.x以后的版本,因为这个版本之前的没有Desktop模块

pip install pywinauto==0.6.8

注意:le.click()限制比较多,只能点击a标签,button标签等,容易出错,所以尽量换一种写法

ActionChains(browser).click(el).perform()
import time
from selenium.webdriver import Chrome, ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as when
from selenium.webdriver.support.wait import WebDriverWait
from pywinauto import Desktop


class TestJs:
    def testjs(self):
        with Chrome() as browser:
            browser.maximize_window()
            browser.get('https://image.baidu.com/')
            el = browser.find_element(By.CSS_SELECTOR, '.st_camera_off')
            ActionChains(browser).click(el).perform()
            wait = WebDriverWait(browser, timeout=10)
            condition = when.element_to_be_clickable((By.CSS_SELECTOR, '#uploadImg'))
            file_btn = wait.until(condition)
            ActionChains(browser).click(file_btn).perform()
            app = Desktop()  # 桌面
            dialog = app['打开']  # 根据名字找到弹出窗口
            dialog['Edit'].type_keys(r'E:\lemon\lianxi\day33_selenuim\2.png')
            dialog['Button'].click()
            time.sleep(3)

pyautogui:

安装这个第三方库时,我的python是3.8版本,老是安装不上,经查确定需要先安装PyGetWindow再安装pyautogui

pip install PyGetWindow==0.0.1

pip install pyautoui

import time
from selenium.webdriver import Chrome, ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as when
from selenium.webdriver.support.wait import WebDriverWait
import pyautogui


class TestDemo:
    def testdemo(self):
        with Chrome() as browser:
            browser.maximize_window()
            browser.get('https://image.baidu.com/')
            el = browser.find_element(By.XPATH, ' //img[@class="st_camera_off"]')
            ActionChains(browser).click(el).perform()
            wait = WebDriverWait(browser, timeout=10)
            condition = when.element_to_be_clickable((By.XPATH, '//a[@id="uploadImg"]'))
            file_btn = wait.until(condition)
            ActionChains(browser).click(file_btn).perform()
            time.sleep(1)  # 一定要有这步,不然出现用例通过,但打开选择文件窗口后定住的问题
            pyautogui.write(r'E:\lemon\lianxi\day33_selenuim\2.png')
            pyautogui.press('enter', 2)
            time.sleep(3)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值