English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
今日は、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(メールの際、#を@に変更してください。通報を行い、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは即座に侵害を疑われるコンテンツを削除します。)