jjzjj

selenium定位元素(包括父子,兄弟)及常见操作

moilbeauty 2024-05-09 原文

文章目录

selenium WebDriver定位元素

  • id定位:find_element_by_id()
  • name定位:find_element_by_name()
  • class定位:find_element_by_class_name()
  • link定位:find_element_by_link_text()
  • partial link定位:find_element_by_partial_link_text()
  • tag定位:find_element_by_tag_name()
  • xpath定位:find_element_by_xpath()
  • css定位:find_element_by_css_selector()
#-----------------------------------------------------------------------
# 通过元素id定位
#-----------------------------------------------------------------------
driver.find_element_by_id("userid")

#-----------------------------------------------------------------------
# 通过class_name定位
#-----------------------------------------------------------------------
# 通过class_name定位一个元素
driver.find_element_by_class_name("userclass")

# 通过class_name定位一批元素,返回结果为数组,下标从0开始
driver.find_elements_by_class_name("userclass")
driver.find_elements_by_class_name("userclass")[1].click()

#-----------------------------------------------------------------------
# 通过xpath定位元素
#-----------------------------------------------------------------------
# 根据元素属性和值定位
# 定位id="userid"的元素
driver.find_element_by_xpath("//*[@id=\"userid\"]")

# 定位placeholder属性为"请输入名字"的input元素,即<input placeholder="请输入名字">
driver.find_element_by_xpath("//input[@placeholder=\"请输入名字\"]")

# 定位id="userid"元素-下层元素span-下层元素第二个input
driver.find_element_by_xpath("//*[@id=\"userid\"]/span/input[1]")

# 多条件定位
driver.find_element_by_xpath("//input[@name=\"username\" and @value=\"lxm\"]")
//input[@name='continue'][@type='button']  # 待验证
driver.find_element_by_id("id").find_element_by_class_name("name")  # 待验证

# 根据文本定位元素
# 定位文本为“世界真美好”的li元素
driver.find_element_by_xpath("//li[text()=\"世界真美好\"]")
# 定位文本为“我爱这个世界”的span元素
driver.find_element_by_xpath("//span[text()=\"我爱这个世界\"]")

# 定位文本为“世界真美好”的li元素-可传入变量
str = "世界真美好"
driver.find_element_by_xpath("//li[text()=\"%s\"]" % str)


# 根据关键字
driver.find_element_by_xpath("//a[contains(@href,\"#id1\")]")

#在a标签下有个文本(text)包含(contains)'网页' 的元素
driver.find_element_by_xpath("//a[contains(text(),'网页')]").click()

#有个叫a的标签,他有个链接href='http://www.baidu.com/ 的元素
driver.find_element_by_xpath("//a[@href='http://www.baidu.com/']").click()



#-----------------------------------------------------------------------
# 通过tag定位元素
#-----------------------------------------------------------------------
# 查找input标签的元素
driver.find_element_by_tag_name("input")

父子、兄弟节点定位

.表示当前节点,…表示父节点,/表示绝对路径,//表示相对路径

根据父节点定位子节点

driver.find_element_by_xpath("//*[text()=\"国家\"]/div/input/span")
# child::input选取当前节点的input子节点
driver.find_element_by_xpath("//*[text()=\"国家\"]/child::div/child::input/child::span")

根据子节点定位父节点

# ..表示父节点
driver.find_element_by_xpath("//*[text()=\"上海\"]/../../span")
# parent::span选取当前节点的span父节点
driver.find_element_by_xpath("//div[text()=\"上海\"]/parent::*/parent::span")

根据兄节点定位弟节点

# 通过兄节点找到父节点,由父节点定位弟节点
driver.find_element_by_xpath("//*[text()=\"上海\"]/../span[3]")
# following-sibling 选取当前节点之后的同级节点
driver.find_element_by_xpath("//*[text()=\"上海\"]/following-sibling::span")
driver.find_element_by_xpath("//*[text()=\"上海\"]/following-sibling::span[2]")

根据弟节点定位兄节点

# 通过弟节点找到父节点,由父节点定位兄节点
driver.find_element_by_xpath("//*[text()=\"上海\"]/../span[0]")
# preceding-sibling 选取当前节点之前的同级节点
driver.find_element_by_xpath("//*[text()=\"上海\"]/preceding-sibling::span")

在元素上操作

click()

# 点击操作
click()

# 单击id为userid的元素
driver.find_element_by_id("userid").click()

send_keys()

# 向元素发送文本
send_keys("luxuemei")

# 向id为userid的元素填充文本luxuemei
driver.find_element_by_id("userid").send_keys("luxuemei")

获取元素上的文本

# 获取元素文本
driver_text = driver.find_element_by_id("userid").text

clear()

# 清除元素的内容,如清除input框内的文字
driver.find_element_by_id("userid").clear()

get_attribute()

# 获取元素属性值
driver.find_element_by_id("userid").get_attribute("value")

WebDriverWait

# 文件引入
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 每0.5s定位ID为userid的元素,如果定位成功,执行下面的代码;直至30s超时抛出异常
# 可用来检查页面元素是否加载完成
WebDriverWait(driver, 30, 0.5).until(EC.presence_of_element_located(By.ID, "userid"))

有关selenium定位元素(包括父子,兄弟)及常见操作的更多相关文章

  1. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  2. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  3. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  4. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  5. ruby - Hanami link_to 助手只呈现最后一个元素 - 2

    我是HanamiWorld的新人。我已经写了这段代码:moduleWeb::Views::HomeclassIndexincludeWeb::ViewincludeHanami::Helpers::HtmlHelperdeftitlehtml.headerdoh1'Testsearchengine',id:'title'hrdiv(id:'test')dolink_to('Home',"/",class:'mnu_orizontal')link_to('About',"/",class:'mnu_orizontal')endendendendend我在模板上调用了title方法。htm

  6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  8. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  9. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  10. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

随机推荐