无法使用python在selenium中通过xpath单击单选按钮元素

时间:2017-05-24 05:27:37

标签: xpath selenium-webdriver

以下是我的HTML

<div id="slectrole" class="collapse in" role="tabpanel" aria-labelledby="selectrole">
<div class="panel-body">
<div class="dropdown">
<input class="search-control jsSayt jsRolesFreeText" onfocus="this.placeholder = ''" onblur="this.placeholder = 'Eg: Delivery, BPO, Driver'" placeholder="Eg: Delivery, BPO, Driver" value="" aria-expanded="false" aria-haspopup="true" data-toggle="dropdown" type="text">
<ul class="jsSaytList jsRolesFilter">
<li id="jsFilter_subRole_1" class="checkbox-inline jsFilterSubRole jsRoleValue_1" data-value="Accountant">
<input id="Accountant" class="radio-custom jsFilterRadio jsRole" value="Accountant" name="Role" data-roleid="1" type="radio">
<label class="radio-custom-label" for="Accountant">Accountant</label>

以下是我用来点击单选按钮的代码:

wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@id='slectrole']/descendant::li[@data-value='Accountant']/label[@for='Accountant']")))


driver.find_element_by_xpath("//div[@id='slectrole']/descendant::li[@data-value='Accountant']/label[@for='Accountant']").click()

代码运行正常,但没有选择单选按钮。

2 个答案:

答案 0 :(得分:1)

好的,所以我可以理解你的挫败感,我尝试了你的代码,并且当通过xpath定位时,无法 .click()(选择)该元素。见下面的打印屏幕: enter image description here 正如您所看到的,只有在通过 CSS -located元素发布radio-button时才点击.click()

问题1:您是否以这种或那种方式约束xpath定位器策略?

如果不是,那么只需使用一个正常的 CSS 选择器:'input[id="Accountant"]'。 否则,您必须弄清楚您正在测试的网站有什么问题,或者切换到另一个WebElement定位器策略。 (例如:IDClassCSSLinkText等。

如果您选择使用 CSS 定位器策略,那么您的代码将如下所示:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "label[for='Accountant']")))
driver.find_element_by_css("input[id='Accountant']").click()

或者,您可以尝试点击<label>附带的radio-button标记,该标记在我的控制台中的工作方式相同:

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "label[for='Accountant']")))
driver.find_element_by_css("label[for='Accountant']").click()

说明:在现实生活中,您可以通过实际的单选按钮或其标签选择radio-button。这就是您的解决方案有效的原因。

问题2:为什么使用如此长的xpath选择器?

为了拥有最佳选择器,您应该始终使用 UNIQUELY 标识目标元素的最短标签/属性组合。否则,您将容易受到网站更改,片状测试案例等的影响。

答案 1 :(得分:0)

您可以在下拉列表中执行单击,然后等待单选按钮出现,然后再单击它。因此,请尝试以下方法:

driver.find_element_by_xpath("//div[@id='slectrole']/div/div[@class='dropdown']/input[1]")).click()
wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.XPATH, '//div[@id='slectrole']/descendant::li[@data-value='Accountant']/input[1]')))
driver.find_element_by_xpath("//div[@id='slectrole']/descendant::li[@data-value='Accountant']/input[1]").click()

如果以上代码适合您,请告诉我。