【问题标题】:Python Selenium - find table elements <td> based on a string and click the associatet radio buttonPython Selenium - 根据字符串查找表元素 <td> 并单击关联单选按钮
【发布时间】:2018-07-18 08:05:43
【问题描述】:

我正在尝试根据他的文本值选择一个单选按钮。

所以在这个site 我用这段代码跳过了第一页(因为它是一个框架)

driver.switch_to_frame(0)
elem = driver.find_element_by_id("bedin")
elem.click()
clickWeiter()

之后我想点击一个单选按钮,它有一个特定的文本,例如'Bus'

我的问题是,实际的单选按钮在标签中

<input type="radio" name="mittel" value="2" onclick="zweiSelect4('neu',2);document.form1.linie.disabled=false;">

但可读文本“Bus”在 td 标签中

<td height="36" align="left" class="Stil1"><input type="radio" name="mittel" value="2" onclick="zweiSelect4('neu',2);document.form1.linie.disabled=false;">Bus </td>

到目前为止,我设法根据他的值而不是文本单击单选按钮

 driver.find_element_by_css_selector("input[type='radio'][value='2']").click

或者我设法获取了文本,但无法点击它

list = driver.find_elements_by_tag_name("td")
for i in list:
    searchval =("Bus")
if searchval in str(i.text):
    print(" BULLSEYE" , i.text)
    i.click()

我的目标是有一个函数,我传递所需的文本(Sonstiges、Bus 等),然后单击元素。

【问题讨论】:

  • 您的if searchval in str(i.text): 代码块缩进错误。这是错误的格式还是您的实际代码?

标签: python selenium selenium-webdriver


【解决方案1】:

根据网站http://nvv31.webqms.de/nvv/kunden/,单击与文本相关的任何单选按钮,如 RegionalzugTramBus,您可以编写一个将字符串作为参数的函数,如下所示:

def click_me(myString):
    driver.find_element_by_xpath("//table[@class='Stil1']//td[contains(.,'" + myString + "')]/input[@name='mittel']").click()

现在您可以调用函数click_me(),并使用以下任何相关文本:

click_me("Regionalzug")
click_me("Tram")
click_me("Bus")
click_me("AnrufSammelTaxi")

【讨论】:

  • 您的代码完美无缺。论点是 Regionalzug 或 Haltestelle 或 Bus 或 Sonstiges 或什至像 zug 这样的部分匹配,这并不重要。一切都很完美。编辑:driver.find_elements_by_xpath 应该是 element ,然后就可以了
  • 我正面临一个与此问题相近的问题。您能解释一下:/input[@name='mittel']" 的作用吗?
  • @exec85 /input[@name='mittel'] 将定位其父/祖先类型为input 的直接子/后代,其name 属性设置为mittel
【解决方案2】:

你可以使用这个xpath

//td[contains(text(),'Bus')]/input  

在代码中:

driver.find_element_by_xpath("//td[contains(text(),'Bus')]/input").click()  

正如你所提到的,你想要一个方法,你可以试试:

visible = "Bus"
driver.find_element_by_xpath("//td[contains(text(),'"+visible+"')]/input").click()  

方法:

def myfunc(visible):
 driver.find_element_by_xpath("//td[contains(text(),'"+visible+"')]/input").click()  

然后您可以使用所需的文本调用此方法。

希望这会有所帮助。

更新:

这些是文本节点,您可以尝试类似:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.action_chains import ActionChains

driver   = webdriver.Chrome(executable_path = r'C:/chromedriver_win32/chromedriver.exe')
driver.maximize_window()

wait = WebDriverWait(driver,40)

driver.get("http://nvv31.webqms.de/nvv/kunden/")

driver.switch_to.frame(driver.find_element_by_xpath("//frame[@src='kundengarantie.php']"))
driver.find_element_by_name('bedin').click()
continue_link = driver.find_element_by_link_text('weiter')
continue_link.click()

driver.switch_to.default_content()

driver.switch_to.frame(driver.find_element_by_xpath("//frame[@src='kundengarantie.php']"))

all_text = driver.find_elements_by_css_selector("td.Stil1 input") 

text_node = driver.execute_script("return arguments[0].nextSibling.textContent;", all_text[1])

text_node_trim = text_node.strip()

print(text_node_trim)


def myfunc(visible):
 driver.find_element_by_xpath("//td[contains(.,'"+text_node_trim+"')]/input").click()  

myfunc("Haltestelle / Bahnhof")

【讨论】:

  • 谢谢cruisepandey 和DebanjanB。您的两种解决方案都有效,但仅适用于 Bus、Regionalzug 等一个词。我不能将“Haltestelle / Bahnhof”和“Tram / RegioTram”作为函数参数来工作 NoSuchElementException:消息:无法定位元素://td[contains(text(),'Tram')]/input
  • 弄乱了异常结果。这是 Tram / RegioTram 作为参数的结果: NoSuchElementException: Message: Unable to locate element: //td[contains(text(),'Tram / RegioTram')]/input
  • 我运行了您的代码,只更改了值 driver = webdriver.Firefox()。现在它总是返回 Haltestelle / Bahnhof,不管 myfunc 中的参数如何。可能是因为可见参数在函数 myfunc 中不存在。您提到一些单选按钮是文本节点。所以六个按钮中的一些与另一个不同?我想说的是,这个网站是否如此混乱,用硒自动化会很痛苦吗?如果它很难,我会​​很乐意使用类似的东西:complain = ("3") # bus driver.find_element_by_css_selector("input[value='%s']" % complain).click()
  • 您必须将 myfun 作为一个方法,该方法将采用两个参数 1。首先是单选按钮的文本 2。单选按钮的编号,我的意思是索引号。给我一些时间,我会尽快更新我的答案。
猜你喜欢
  • 2017-07-09
  • 2014-10-11
  • 2014-06-24
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多