Selenium WebDriver单击可跳过一些复选框 [英] Selenium WebDriver Click skips some checkboxes

查看:85
本文介绍了Selenium WebDriver单击可跳过一些复选框的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是对此的后续问题:

找到了WebDriver元素,但单击后却什么也没返回

我正试图从在下拉菜单中进行选择后,代码中的URL。我首先单击进度监视,然后单击实物和财务项目摘要。然后,我进行以下选择:州,地区,街区,年份,批次和协作。我还要检查道路明智按钮,然后单击查看按钮。加载表格后,我想单击保存按钮并下载excel文件。在下面的代码中,我还将循环浏览状态项下的不同选择。这是我的代码:

I am trying to scrape data from the URL in the code after making selections in the drop-down menu. I first click on Progress Monitoring and then Physical and Financial Project Summary. Then I make the following selections: State, District, Block, Year, Batch, and Collaboration. I would also like to check the Road Wise button and then click on the view button. After the table loads, I would like to click on the save button and download the excel file. In the code below I also loop through different selections under "State" item. Here is my code:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import time
import os


chromedriver = r"C:\Users\yuppal\chromedriver"
os.environ["webdriver.chrome.driver"] = chromedriver

browser = webdriver.Chrome(chromedriver)
browser.implicitly_wait(10)
browser.get("http://omms.nic.in")
browser.maximize_window()

#Click on the item Progress Monitoring
progElem = browser.find_element_by_link_text("Progress Monitoring").click()
#Click on the item Physical and Financial Project Sumamry
summElem = browser.find_element_by_link_text("Physical and Financial Project Summary").click()

#Find the element for state and create a list of different selection options    
stateElem = browser.find_element_by_xpath("//select[@name='StateCode']")
state_options = stateElem.find_elements_by_tag_name("option")

#delete the first option in the list
del state_options[0]

def select_option(xpath, text):
    '''
    This function will select the remaining dropd-down menu items. 
    '''
    elem = browser.find_element_by_xpath(xpath)
    Select(elem).select_by_visible_text(text)

#run the loop for each option in the list of states
for option in state_options:

        select_state = Select(stateElem).select_by_value(option.get_attribute("value"))
        # Select the district.
        select_option("//select[@name='DistrictCode']","All Districts")   
        # Select the block.
        select_option("//select[@name='BlockCode']","All Blocks")   
        # Select the year.
        select_option("//select[@name='Year']","All Years")
        # Select the batch.
        select_option("//select[@name='Batch']","All Batches")
        # Select the funding agency.
        select_option("//select[@name='FundingAgency']","Regular PMGSY")

        # Check the road wise box.
        time.sleep(10)
        checkElem = WebDriverWait(browser, 120).until(EC.element_to_be_clickable((By.XPATH, "//input[@title='Road Wise']")))
        browser.execute_script("arguments[0].click();", checkElem)

        # Click on the view button.
        time.sleep(10)
        browser.find_element_by_xpath("//input[@type='button']").click()



        # Switch to a new frame.
        time.sleep(10)
        frame = browser.find_element_by_xpath("//div[@id='loadReport']/iframe")
        browser.switch_to.default_content()
        #browser.switch_to.frame(frame)
        WebDriverWait(browser, 120).until(EC.frame_to_be_available_and_switch_to_it(frame))
        #browser.switch_to.frame(browser.find_element_by_xpath("//*[@id='loadReport']/iframe"))

        # click on the save button
        time.sleep(10)
        WebDriverWait(browser, 120).until(EC.element_to_be_clickable((By.XPATH, "//a[@title='Export drop down menu']"))).click()

        # Within the save button, Click on the "Excel" option.
        time.sleep(10)
        WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div/a[@title='Excel']"))).click()


        # Switch back to the main content.
        time.sleep(20)
        browser.switch_to.default_content()

我的问题是仅在某些州单击明智的道路复选框。因此,循环会继续进行,而无需单击某些状态的复选框。我检查了HTML代码,所有复选框都相同。

My issue is the "Road Wise" checkbox gets clicked only for some states. Thus the loop proceeds without clicking the checkbox for some states. I checked the HTML code and it is the same for all checkboxes.

我认为问题可能是在单击道路按钮之前,先单击了查看按钮。因此,我在道路明智和查看按钮之前都花了一些等待时间。但这似乎无济于事。因此,我真的无法理解为什么在循环中没有为某些迭代单击复选框按钮。

I thought the problem might be that the "View" button gets clicked before the road wise button is clickable. So I put some waiting period before both road wise and view buttons. But that doesn't seem to help. So I can't really understand why the checkbox button isn't clicked for some iterations in the loop.

推荐答案

在单击之前复选框,请检查是否已选中:

Before clicking on the checkbox, check that is already selected or not:

# Check the road wise box.
time.sleep(10)
checkElem = WebDriverWait(browser, 120).until(EC.element_to_be_clickable((By.XPATH, "//input[@title='Road Wise']")))

if checkElem.is_selected() != True:

    browser.execute_script("arguments[0].click();", checkElem)

PS:在您的情况下,点击只会出现在循环的第一次迭代中。

PS: In your case, the click will be only in the first iteration of the loop.

这篇关于Selenium WebDriver单击可跳过一些复选框的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆