【python一轮复习--学习过程的问题及解决】

day01

1、报错获取不到浏览器二进制文件:需要指定浏览器路径及驱动路径。

第一次使用谷歌浏览器驱动,找不到二进制文件

报错:
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
Stacktrace:

原因:没有把谷歌浏览器安装在默认的地方

这个错误信息表明在尝试初始化webdriver.Chrome()时,Selenium无法找到Chrome浏览器的二进制文件。错误信息为:“unknown error: cannot find Chrome binary”。这通常发生在以下几种情况:

Chrome未安装:确保Google Chrome浏览器已经安装在你的系统上,并且安装在默认路径。对于Windows系统,Chrome通常安装在C:\Program Files (x86)\Google\Chrome\Application\chrome.exe或者C:\Program Files\Google\Chrome\Application\chrome.exe。

安装路径非标准:如果Chrome安装在非标准路径,Selenium可能无法自动找到它。在这种情况下,你需要在Selenium的ChromeOptions中手动指定Chrome的位置。

环境变量问题:确保系统的环境变量中包含了Chrome的路径,这样Selenium就能找到Chrome的二进制文件。

针对这个问题,如果Chrome已经安装但Selenium仍然报错,你可以通过以下方式手动指定Chrome的路径:

 指定路径的代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

chrome_driver_path = "D:/path/to/chromedriver.exe"  # Chrome Driver的路径
chrome_binary_path = "C:/Program Files/Google/Chrome/Application/chrome.exe"  # Chrome浏览器的路径,根据实际安装位置调整

options = Options()
options.binary_location = chrome_binary_path
service = Service(executable_path=chrome_driver_path)

driver = webdriver.Chrome(service=service, options=options)

请确保将chrome_driver_pathchrome_binary_path替换为你系统上实际的路径。这样,Selenium就能正确地找到并使用Chrome浏览器了。

2、selenium的原理

地址:了解组件 | Selenium

3、更新pip的指令

python -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/

day02

1、会手写Xpath--只用相对路径

 1)通过唯一标识的方式

不管是什么元素类型,使用通配符*

el = driver.find_element(By.XPATH,"//*[@ID='topBooks2']")

 

 在确定元素类型的情况下,使用元素类型 dl 去匹配元素

el = driver.find_element(By.XPATH,"//dl[@ID='topBooks2']")

2)以。。开头--模糊查询

el = driver.find_element(By.XPATH,'//a[starts-with(text(),"神医毒妃")]')

3)包含

el = driver.find_element(By.XPATH,'//a[contains(text(),"神医毒妃")]')

4)苏雪梅

要编写XPath来定位包含“苏雪梅”的元素

1. **直接定位包含文本的`<a>`标签**:
   
   //td[@class='name']/a[contains(text(),'苏雪梅')]

   这个XPath查找类名为`name`的`<td>`标签下的`<a>`标签,其中包含文本“苏雪梅”。


2. **使用文本定位整个`<td>`标签**:
   
   //td[contains(.,'苏雪梅')]
   
   这个XPath查找任何包含“苏雪梅”文本的`<td>`标签。点(`.`)表示当前节点,所以`contains(.,'苏雪梅')`是查找当前节点及其子节点中包含指定文本的情况。


3. **基于特定父标签的ID定位**:
   
   //tbody[@id='newRankBooks2']//a[contains(text(),'苏雪梅')]
   ```
   如果页面上有多个元素包含“苏雪梅”且你只对特定区域(例如ID为`newRankBooks2`的`<tbody>`内的元素)感兴趣,这个XPath会更加精确。


4. **考虑使用兄弟节点定位**:
   如果你想基于与目标元素相邻的其他元素(例如作者名“张莹”)来定位“苏雪梅”,可以使用如下XPath:
  
   //td[a[contains(text(),'张莹')]]/preceding-sibling::td[@class='name']/a[contains(text(),'苏雪梅')]
   
   这个XPath首先定位包含文本“张莹”的`<a>`标签的`<td>`标签,然后向前查找前一个兄弟`<td>`标签,该标签的类为`name`,并且其子`<a>`标签包含文本“苏雪梅”。

day03

1、等待

1)强制等待--调试代码

import time 

time.sleep(3)

程序执行到此处会强制等待3s

2)隐式等待

driver.implicitly_wait(2)

表示对程序执行整个生命周期内的元素都会等待2s.不需要导包哦

3)显式等待

4)包含下拉框的项目地址

包含下拉框的项目地址:https://sahitest.com/demo/selectTest.ht

2、Allure和JDK的下载和安装

Allure下载和安装--很难下载,还是直接解压安装包比较可行。

allure的安装和使用_allure安装教程-CSDN博客

 allure是单独的,pytest也是单独的,两个单独的东西,需要一个依赖包allure-pytest,来做一个关联

果然还得是这个指令好使,使用阿里云的镜像才好用

pip install allure-pytest -i https://mirrors.aliyun.com/pypi/simple/

JDK下载和安装:

JDK的下载安装及环境配置(图文)_jdk 下载-CSDN博客

3、reverse方法的使用

lst1 = [1, 2, 3, 4, 5]
lst1.reverse() 
print("倒序输出: ", lst1)

为什么print打印的lst1是倒序的呢,执行上面的倒序函数会改变lst1自身吗
解答:

`lst1.reverse()`这个操作会改变`lst1`自身,使列表中的元素顺序反转。

当你对一个列表调用`.reverse()`方法时,这个操作会就地(in-place)修改列表,也就是说,它会直接在原列表上修改元素的顺序,而不会创建一个新的列表。所以,原始的列表对象`lst1`会被修改,其中的元素将以相反的顺序重新排列。这就是为什么在你执行了`lst1.reverse()`之后,`print(lst1)`会以倒序输出列表的元素。

下面是关于`.reverse()`方法的一些要点:

- **就地修改**:`.reverse()`是一个就地操作的方法,它不返回新的列表,而是直接修改原来的列表。
- **无返回值**:`.reverse()`方法没有返回值。在Python中,如果一个函数或方法没有明确的`return`语句,或者`return`后面没有跟任何表达式,那么该函数或方法将默认返回`None`。因此,如果你尝试将`.reverse()`的返回值赋给一个变量,你会得到`None`。
- **效率**:由于`.reverse()`是就地操作,它通常比生成并返回一个倒序列表的操作更高效,因为它不需要额外的内存来存储新列表。

在你的例子中,`lst1 = [1, 2, 3, 4, 5]`定义了一个列表,然后通过调用`lst1.reverse()`,你得到了这个列表的倒序版本,即`[5, 4, 3, 2, 1]`。因此,打印出来的结果是按照这个新顺序显示的。

扩展:就地修改的方法

在Python中,有些方法会就地修改对象,而有些方法则会生成新的对象。要区分它们,可以查看方法的文档或源代码,或者通过观察方法调用后对象的变化来进行判断。

以下是一些常见的情况:

1. 就地修改(in-place):
   - 字符串拼接操作(如`+=`)  例如:a+=1
   - 列表的`append()`、`extend()`、`insert()`、`remove()`、`pop()`等方法
   - 字典的`update()`方法
   - 集合的`add()`、`remove()`、`discard()`等方法

2. 生成新对象:
   - 字符串的`split()`、`join()`、`replace()`等方法
   - 列表的`copy()`、`slice`操作、`sorted()`函数等
   - 字典的`copy()`、`keys()`、`values()`、`items()`等方法
   - 集合的`union()`、`intersection()`、`difference()`等方法

需要注意的是,即使一个方法看起来是就地修改,但在某些情况下也可能生成新的对象。因此,最好的做法是查阅相关文档或源代码以了解方法的具体行为。

列表和数组的区别:

列表(List)和数组(Array)在很多编程语言中都是用来存储一系列元素的数据结构,。以下是它们之间的一些主要区别:

动态性:
列表通常是动态的,可以在运行时添加、删除或修改列表中的元素,而不需要预先指定列表的大小。
数组通常是静态的,需要在声明时指定数组的大小,并且之后不能改变它。
虽然有些语言(如Java)提供了动态数组(如ArrayList),但它们的底层实现可能与传统数组有所不同。

内存管理:
数组通常是在连续的内存块中存储元素的,这意味着数组的访问速度通常很快,数组的大小是固定的
列表可以在需要时动态地扩展或缩小其内存空间。这可能会使列表的访问速度稍慢于数组

类型检查:
数组中的所有元素都必须是相同的数据类型。
列表可以包含不同类型的元素。

语言支持:
一些语言(如C和C++)主要使用数组
而其他语言(如Python和Java)则更倾向于使用列表或其他类似的动态数据结构。
在Java中,列表(List)和数组(Array)都有广泛的使用,它们的选择取决于具体的应用场景和需求。

数组(Array):

数组在Java中是一个固定大小的数据结构,用于存储相同类型的元素。
数组在内存中是连续存储的,因此访问数组中的元素通常很快。
数组的大小在创建时确定,之后不能改变。如果需要更多的空间来存储数据,必须创建一个新的数组,并将旧数组中的元素复制到新数组中。
数组是Java的基本数据类型之一,因此在使用时不需要额外的导入或依赖。


列表(List):

Java中的列表(如ArrayList、LinkedList等)是动态数据结构,可以在运行时添加、删除或修改元素。
列表的大小不是固定的,可以根据需要自动扩展或缩小。
列表提供了丰富的API,如add()、remove()、get()等,使得操作元素更加方便。
列表是Java集合框架(Collections Framework)的一部分,需要导入相应的包(如java.util.ArrayList)才能使用。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值