English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python seleniumの親子、兄弟、隣接ノードの定位方法の詳細

今日は、seleniumで親、兄弟、相邻ノードに基づいて定位する方法についてお話しします。実際のアプリケーションでは、直接定位できないノードが多く、近くのノードを基に相対定位が必要なことがありますが、親ノードから子ノードへの定位は簡単ですが、子ノードから親ノードへの定位や、ノードの兄弟ノードの定位は難しいです。焦らず、ブログ主が一つずつ説明します。

1. 親ノードから子ノードへの定位

もっとも簡単な方法は、親ノードから子ノードを定位することです。多くの方法がありますが、以下の例を見てみましょう:

以下のコードに対して:

<html>
<body>
<div id="A">
<!--親ノードから子ノードの定位-->
<div id="B">
<div>親から子へ</div>
</div>
</div>
</body>
</html>

Bノードを基にidのない子ノードを定位するには、以下のようのコード例があります:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.連続検索
print driver.find_element_by_id('B').find_element_by_tag_name('div').text
# 2.xpath父子関係検索
print driver.find_element_by_xpath("//div[@id='B']/div").text
# 3.css selector父子関係寻找
print driver.find_element_by_css_selector('div#B>div').text
# 4.css selector nth-child
print driver.find_element_by_css_selector('div#B div:nth-child(1).text
# 5.css selector nth-of-type
print driver.find_element_by_css_selector('div#B div:nth-of-type(1).text
# 6.xpath軸 child
print driver.find_element_by_xpath("//div[@id='B']/child::div).text
driver.quit()

結果:

parent to child
parent to child
parent to child
parent to child
parent to child
parent to child

第1まで3これらは私たちがよく知っている方法であり、特に触れずに済みます。4この方法ではcss選択子nthを使用しています-child(n)、この選択子は第n個のノードを返します。このノードはdivタグです;第5この方法では別のcss選択子であるnthを使用しています-of-type(n)、この選択子は第n個のdivタグを返します。前の選択子との違いに注意してください;第6この方法ではxpathの軸childを使用しています。これはxpathのデフォルトの軸であり、省略することもできます。実際のところは、以下の方法と同じです2同じです。

もちろん、cssには親子関係を選択できる選択子もいくつかあります。例えばlast-child、nth-last-childなど、興味がある場合は自分で百度で検索してください、機会があればブログでcss selectorについても説明します。

2. 子ノードから親ノードを定位する

子ノードから親ノードに定位するのは少し難しいですが、以下のコードについて説明します:

<html>
<body>
<div id="A">
<!--子ノードから親ノードを定位する-->
<div>
<div>child to parent
<div>
<div id="C"></div>
</div>
</div>
</div>
</div>
</body>
</html>

Cノードからその2層上の親ノードのdivを定位したい場合は、以下の例のコードを使用します:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath: `.`は現在のノードを、`..`は親ノードを表します
print driver.find_element_by_xpath("//div[@id='C']/../..).text
# 2.xpath軸 parent
print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div).text
driver.quit()

結果:

child to parent
child to parent

ここには2つの方法があります、第1もう1つは..の形式で、私たちが知っているように、.は現在のノードを、..は親ノードを表します;第2この方法は上記と同様で、xpathの軸の1つである:parentで、現在のノードの親ノードを取得します。ここもまたcss selectorの痛点であり、cssの設計では親ノードを取得できる方法がない(少なくとも現在はない)

3. 由弟弟节点定位哥哥节点

这是第3、第4种情况,我们这里要定位的是兄弟节点了。如以下源码:

<html>
<body>
<div id="A">
<!--下面两个节点用于兄弟节点定位-->
<div>brother 1</div>
<div id="D"></div>
<div>brother 2</div>
</div>
</body>
</html>

怎么通过 D节点 定位其哥哥节点呢?看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其哥哥节点
print driver.find_element_by_xpath("//div[@id='D']/../div[1]
# 2.xpath轴 preceding-sibling
print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]
driver.quit()

结果

brother 1
brother 1

这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过 xpath轴:preceding-sibling,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,1 代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远,当然,xpath轴:preceding也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)

4. 由哥哥节点定位弟弟节点

源码与 3 一致,要想通过 D节点 定位其弟弟节点,看代码示例:

# -*- coding: utf-8 -*-
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
# 1.xpath,通过父节点获取其弟弟节点
print driver.find_element_by_xpath("//div[@id='D']/../div[3]
# 2.xpath轴 following-sibling
print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]
# 3.xpath轴 following
print driver.find_element_by_xpath("//div[@id='D']/following::*").text
# 4.css selector +
print driver.find_element_by_css_selector('div#D + div').text
# 5.css selector ~
print driver.find_element_by_css_selector('div#D ~ div').text
driver.quit()

結果:

brother 2
brother 2
brother 2
brother 2
brother 2

ブログの作者が弟ノードを定位する5つの方法を共有しました。最初の3つはxpathを使用しています。最初のものは簡単に理解できますが、2番目のものはxpathの軸:followingを使用しています。-sibling、preceding-siblingと同様に、現在のノードのすべての同級弟ノードを取得する役割を果たします。同様に、1 現在のノードの最も近い弟ノードを示します。数字が大きいほど、現在のノードから離れています。第3種では、xpathの軸:followingを使用して、現在のノードの後のすべてのノード(祖先ノードを除く)を取得します。第4、第5種では、css selectorを使用します。+ 和 ~ の違いは: + 現在のノードの直後に続くdivノードを示します、~は現在のノードの直後に続くdivノードを示します。find_elementsを使用すると、divノードのグループを取得できます。

以上は、Python seleniumの親、兄弟、隣接ノードの定位方法の詳細な説明を紹介しました。皆様に役立つことを願っています。何かご不明な点がございましたら、コメントをお願いします。編集者は迅速に回答いたします。このサイトへのサポートに感謝します。

声明:この記事の内容はインターネットから収集され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしました。このサイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権侵害を疑われる内容がある場合は、メールでnotice#wまでお知らせください。3codebox.com(メールの際、#を@に変更してください。通報を行い、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ