以下是我的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()
代码运行正常,但没有选择单选按钮。
答案 0 :(得分:1)
好的,所以我可以理解你的挫败感,我尝试了你的代码,并且当通过xpath
定位时,无法 .click()(选择)该元素。见下面的打印屏幕:
正如您所看到的,只有在通过 CSS -located元素发布radio-button
时才点击.click()
。
问题1:您是否以这种或那种方式约束xpath
定位器策略?
如果不是,那么只需使用一个正常的 CSS 选择器:'input[id="Accountant"]'
。
否则,您必须弄清楚您正在测试的网站有什么问题,或者切换到另一个WebElement
定位器策略。 (例如:ID
,Class
,CSS
,LinkText
等。
如果您选择使用 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()
如果以上代码适合您,请告诉我。