python+selenium定位网页 动态元素 + 定位非select(即input)的下拉列表 + 返回上一个函数进行保存操作

1、python+selenium定位网页动态元素

这个折磨我快一天的小东西,磨的我都快想睡觉了
在这里插入图片描述
网上大佬门的经验啥的都看遍了,或许是看到不够多,找了一天都没解决,然后现在终于找到了解决的办法!!!

报错:
selenium.common.exceptions.NoSuchElementException: Message: nosuch element: Unable to locate element:{“method”:“xpath”,“selector”:"/html/body/div[16]/div/div[2]/div/form/div[1]/div/div/div/input"}(Session info: chrome=91.0.4472.124)

先简单说一下的我的基本情况:
在原网站上打开一个新增数据的div弹窗,这个新增的弹窗属于原窗口但是动态加载的,就是点了新增按钮才会出现弹窗和数据,关了弹窗数据就会消失的,所有里面的div的位置也会实时变化,因此用固定的xpath路径是行不通滴。
然后仔细观察,找到动态变化的那个div,div里面会变化的数字就替换成 last() 就可以了,然后再执行就可以找到动态变化的元素位置了。

来个小解说,我发现我复制的xpath路径和他们的都不同,他们的是类似于 这种的路径//*[@id=“form”]/form/div/div[3]/button[1],而我的是直接从/html/body/……开始的,然后看了好多都没解决,最后才找到两个和我相似的博主的解决办法。

例如:
在这里插入图片描述
解决办法参考来源:
链接1:
https://blog.csdn.net/weixin_43590262/article/details/109529000?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-17.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-17.control
链接2: https://blog.csdn.net/sun_977759/article/details/100989829

2、定位非select(即input)的下拉列表

python+selenium定位网页动态的div窗口元素后,发现输入的数据还有非select的input下拉列表,然后研究后,自己采用如下的解决办法,即是点击该下拉列表,从弹出的下拉列表中选择第一个选项

说明:因为下拉列表也是动态实时更新的,所以也定位到最后一个函数即下拉列表的位置
在这里插入图片描述

3、返回上一个函数进行保存操作

开始我想的是切换成当前的窗口句柄,试了试发现不行,因为是在同个窗口执行的,且last()定位的是最后一个函数

此处与第二点是接应的:
由于下拉列表是动态实时更新的,因此定位到最后一个函数即下拉列表的位置,如果此时直接进行点击保存当前数据,会报错的,因为元素无法定位到最后一个函数的保存按钮位置,因此需要返回倒数第二个函数的位置进行搜索保存按钮的位置,用到 last()-1
在这里插入图片描述

举例说明:
在这里插入图片描述

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在使用 PythonSelenium进行元素定位时,可以创建一个类来管理定位相关的操作。下面是一个示例代码: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class ElementLocator: def __init__(self, driver): self.driver = driver def find_element_by_id(self, element_id): return self.driver.find_element(By.ID, element_id) def find_element_by_xpath(self, xpath): return self.driver.find_element(By.XPATH, xpath) def wait_for_element_visible(self, locator, timeout=10): return WebDriverWait(self.driver, timeout).until(EC.visibility_of_element_located(locator)) # 可以添加其他常用的元素定位方法,比如 find_element_by_css_selector、find_element_by_class_name 等等 # 示例用法 driver = webdriver.Chrome() element_locator = ElementLocator(driver) element = element_locator.find_element_by_id("element_id") element.click() visible_element = element_locator.wait_for_element_visible((By.XPATH, "//div[@class='my-element']")) ``` 在上面的示例代码中,我们创建了一个名为 `ElementLocator` 的类,它接收一个 Selenium WebDriver 对象作为参数,并提供了一些常用的元素定位方法,比如 `find_element_by_id` 和 `find_element_by_xpath`。此外,还添加了一个 `wait_for_element_visible` 方法,用于等待元素可见。 你可以根据自己的需要扩展 `ElementLocator` 类,添加其他常用的元素定位方法,以便于在测试或爬虫等场景中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值