使用selenium

时间:2018-03-17 00:07:09

标签: python selenium

以下是html代码的摘录:

<div class="Class1">Category1</div>
<div class="Class2">"Text1 I want"</div>
<div class="Class1">Category2</div>
<div class="Class2">"Text2 I want"</div>

我知道我可以使用:

提取Text1和Text2
find_element = browser.find_elements_by_xpath("//div[@class='Class2']")
element = [x.text for x in find_element]
text1 = element[0]
text2 = element[1]

但是如果更改了html的结构,则会相应地更改元素。我有没有办法通过分别引用Category1和Category2来提取Text1和Text2?

谢谢。

3 个答案:

答案 0 :(得分:1)

如果Text I want始终位于div的下一个同级Category div内,您可以尝试以下操作:

案例1

<div class="Class1">Category1</div>
<div class="Class2">"Text1 I want"</div>

//div[.='Category1']/following-sibling::div[1]

案例2

<div class="Class1">Category1</div>
<div class="Class2">
  <div class="xxx">
    <span>"Text1 I want"</span>
  </div>
</div>

//div[.='Category1']/following-sibling::div[1]//span

可能有许多可能的结构,xpath中的关键部分是//div[.='Category1']/following-sibling::div[1]

答案 1 :(得分:0)

我建议使用BeautifulSoup。找到Category1标记,然后找到它的next_sibling

import bs4
your_html = browser.page_source
soup = bs4.BeautifulSoup(your_html, 'lxml')

class1tag = soup.find('div', text='Category1')
tag = class1tag.next_sibling.next_sibling
print(tag)
#<div class="Class2">"Text1 I want"</div>
print(tag.text)
#"Text1 I want"

答案 2 :(得分:0)

我猜你对html结构变化的关注是基于这样一个事实,即数据的语义是支付的键值(键是类别,值是文本),而结构只是一个div列表,其中奇数是键,下面的偶数是它们对应的值。 问题不在于你的Selenium定位器,而在于html本身的结构(这会影响你使用更强大的定位器的能力)。我建议你要求开发人员改进html的结构以反映它的适当语义。一起讨论 最适合所有需求的结构,包括测试自动化的结构。