Нажмите переключатель, связанный с меткой с тем же именем, с помощью Firefox WebDriver - PullRequest
1 голос
/ 31 марта 2019

Я использую Selenium 3.12.0 с Python 3.7.2 и Firefox 66.0.1 на Fedora 29. У меня проблемы с переключением радиокнопки. Переключатель находится внутри метки, а радио и метка используют одно и то же имя. Страница расположена по адресу https://complaints.donotcall.gov/complaint/complaintcheck.aspx.

<label for="PrerecordMessageYESRadioButton">
    <input id="PrerecordMessageYESRadioButton" type="radio" name="PrerecMsg" value="PrerecordMessageYESRadioButton" tabindex="7">
    <label for="PrerecordMessageYESRadioButton">Yes</label>
</label>

Когда я проверяю снимок экрана после завершения страницы, я вижу, что переключатели не нажаты. Остальные элементы на странице заполнены ОК.

Я пробовал driver.find_element_by_id("PrerecordMessageYESRadioButton"), driver.find_element_by_name("PrerecMsg") и driver.find_element_by_css_selector("input#PrerecordMessageYESRadioButton"). После выбора я также попробовал radio.click(), radio.send_keys(Keys.ENTER) и radio.send_keys(Keys.SPACE) без радости. Наконец, driver.execute_script("arguments[0].click();", radio) тоже не помог.

Как в этом случае щелкнуть переключатель, связанный с меткой?


Радио кнопки, кажется, доставляют немало хлопот. Вот некоторые связанные вопросы, но они не помогли в этом случае проблемы. Первая ссылка и ответ @ Ён, похоже, очень актуальны для этой проблемы.


Вот тестовый скрипт:

$ cat test-driver.py
#!/usr/bin/env python3

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options

def main():

    opts = Options()
    opts.headless = True
    driver = webdriver.Firefox(options=opts)   

    #################################################

    print("Fetching page 1")    
    driver.get("https://complaints.donotcall.gov/complaint/complaintcheck.aspx")

    print("Clicking Continue")
    button_continue = driver.find_element_by_id("ContinueButton")
    button_continue.click()

    #################################################

    print("Fetching page 2")    
    time.sleep(2) 

    text_phone = driver.find_element_by_id("PhoneTextBox")
    for ch in "8005551212":
        text_phone.send_keys(ch)

    text_calendar = driver.find_element_by_id("DateOfCallTextBox")
    for ch in "03/30/2019":
        text_calendar.send_keys(ch)

    dropdown_hour = driver.find_element_by_id("TimeOfCallDropDownList")
    dropdown_hour.send_keys("10")

    dropdown_minute = driver.find_element_by_id("ddlMinutes")
    dropdown_minute.send_keys("30")

    # PrerecordMessageYESRadioButton
    radio_robocall = driver.find_element_by_name("PrerecMsg")
    # radio_robocall = driver.find_element_by_css_selector("input#PrerecordMessageYESRadioButton")
    radio_robocall.send_keys(Keys.ENTER)
    radio_robocall.send_keys(Keys.SPACE)
    ...

    driver.quit()


if __name__ == "__main__":
    main()

Перечисление элементов на странице по id:

ids = driver.find_elements_by_xpath('//*[@id]')
for val in ids:
    print(val.get_attribute('id'))

Возвращает следующее:

Head1
_fed_an_ua_tag
bdyComplaint
top
changeLang
topnav
navbtn
mobileChangeLang
Form1
__EVENTTARGET
__EVENTARGUMENT
__VIEWSTATE
__VIEWSTATEGENERATOR
__EVENTVALIDATION
StepOnePanel
StepOneEntryPanel
ErrorMsg
PhoneTextBox
DateOfCallTextBox
TimeOfCallDropDownList
ddlMinutes
PrerecordMessageYESRadioButton
PrerecordMessageNORadioButton
PhoneCallRadioButton
MobileTextMessageRadioButton
ddlSubjectMatter
spnTxtSubjectMatter
txtSubjectMatter
StepOneContinueButton
hdnBlockBack
hdnPhoneChecked
hdnCompanyChecked
hdnPhoneNumber

Вот что я вижу после получения скриншота.

enter image description here

1 Ответ

1 голос
/ 31 марта 2019

Пожалуйста, проверьте статус радио, используя is_selected:

radio_robocall = driver.find_element_by_name("PrerecMsg")
# is_selected should return False
print(f"radio_robocall status: {str(radio_robocall.is_selected())}")

radio_robocall.click()
# is_selected should return True
print(f"radio_robocall status: {str(radio_robocall.is_selected())}")
...