Selenium Python Web元素不可见

时间:2017-12-19 18:35:43

标签: python selenium

我有一个子菜单项,我以前可以通过selenium web navigation访问。现在我不断收到以下错误:"您只能与可见元素进行交互"。我已经尝试了许多建议(等待,隐式/显式,最大化窗口,使用ActionChain对象)但没有成功。任何人都可以通过查看以下HTML和代码来了解为什么这个元素会保持不可见?:

        <ul class="nav" >
             <li>
                <a href="/edc">EDC</a>
            </li>
        </ul>


        <ul class="nav" >
            <li>
                <a href="/qa/main">Queries</a>
            </li>
        </ul>


        <ul class="nav" >
            <li>
                <a href="/docs">Docs</a>
            </li>
        </ul>


        <ul class="nav" >
            <li>
                <a href="/data">Data</a>
            </li>
        </ul>


        <ul class="nav" >
            <li>
                <a href="/aal/main">Audit Log</a>
            </li>
        </ul>


        <ul class="nav" >
            <li>
                <a href="/summaries/main">Reports</a>
            </li>
        </ul>


        <ul class="nav" >
            <li class="dropdown ">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">Tools <b class="caret"></b></a>
                <ul class="dropdown-menu">

            <li>
                <a href="/sql">SQL Worksheet</a>
            </li>
            <li>
                <a href="/meddra">Meddra</a>
            </li>
            <li>
                <a href="/sae">SAE</a>
            </li>
            <li>
                <a href="/pdf">Worksheets</a>
            </li>
            <li>
                <a href="/pipelines/report">Pipelines</a>
            </li>
            <li>
                <a href="/tools/sync">Sync</a>
            </li>
            <li>
                <a href="/db">Project Management</a>
            </li>
            <li>
                <a href="/rss">RSS</a>
            </li>
            <li>
                <a href="/ipt/main">IPT</a>
            </li>
            <li>
                <a href="/images/main">Images</a>
            </li>
        </ul>
    </li>
</ul>

这是不起作用的python代码片段:

try:
    menu_item = driver.find_element(By.LINK_TEXT, 'Tools')
    actions = ActionChains(driver)
    actions.click(menu_item).perform()

except Exception as error:
    print ("Tools menu not found: " + str(error))

try:
    wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located(By.XPATH("/html/body/header/div/div/div/div/ul[7]/li/ul/li[9]/a")));
    ipt_menu_item = driver.find_element(By.XPATH, "/html/body/header/div/div/div/div/ul[7]/li/ul/li[9]/a")
    actions.click(ipt_menu_item).perform()

except Exception as error:
    print ("Tools | IPT link not found: "  + str(error))

1 个答案:

答案 0 :(得分:1)

我几次处理过同样的问题,我发现大多数时候你可以先移动到元素然后发出.click()命令:

Element = driver.find_element_by_link_text('link')
actions = ActionChains(driver)
# try this
actions.move_to_element(Element)
# or this
driver.execute_script("return arguments[0].scrollIntoView();", Element)
Element.click()

编辑: 或者,第三个选项用于点击以防前两个不起作用,如果你可以获得带有selenium的元素并且元素在视图中,但是只是无法与它交互,那么它可能在<div后面那是不可见的。试试这次点击而不是正常的.click():

driver.execute_script("arguments[0].click()", Element)

如果这不起作用,您可能需要尝试与属性进行交互,以便在进行点击之前使元素处于硒的可见性状态,例如:

driver.execute_script("arguments[0].style.display = 'block'", Element)