【问题标题】:Script cannot find button using xpath or id or anything else through Selenium and Python脚本无法通过 Selenium 和 Python 找到使用 xpath 或 id 或其他任何东西的按钮
【发布时间】:2019-02-07 15:04:55
【问题描述】:

我在使用 Python 方面还很陌生,但这似乎是我正在尝试编写的一个非常简单的脚本。我已经能够正确登录到该网站,但要进入下一步,我正在尝试单击一个显示“Market Express”的按钮。

我可以看到 xpath (//[@id="MarketExpress"]) 以及按钮的 id (MarketExpress)。当我运行该模块时,我收到此错误:“无法找到元素://[@id="MarketExpress"]”

我什至使用 Firefox 的插件“xpath finder”仔细检查了 xpath,以确保我拥有正确的代码。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

usernameStr = '***'
passwordStr = '***'

driver = webdriver.Firefox()
driver.get(('https://www.myurl.com'))

username = driver.find_element_by_id('USERID')
username.send_keys(usernameStr)
password = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'currentPassword')))
password.send_keys(passwordStr)
nextButton = driver.find_element_by_id('submit-button')
nextButton.click()

password = driver.find_element_by_name('currentPassword')
password.send_keys(passwordStr)
nextButton = driver.find_element_by_name('Submit')
nextButton.click()

marketExpress = driver.find_element_by_xpath('//*[@id="MarketExpress"]').click();

我尝试了很多不同的方法,但无法让脚本单击此按钮,我将不胜感激!

下面是按钮所在的html:

<input class="crtordbtn" type="button" value="Market Express" `id="MarketExpress" onclick="parent.location.href='/OMAPX?userId=051220665&amp;clientId=8&amp;UserType=null&amp;BuyerCookie=null';">`

下面是我认为按钮所在的表格:

 <div id="sidebar-left" height="50%" style="margin-right:10px">
<div id="bar" style="margin-right:-3px"><h1>Select To Order</h1></div>

<div style="width:100%; height:50%; border-left:1px solid #cccccc;border-right:1px solid #cccccc;border-bottom:1px solid #cccccc;margin-bottom:10px;"> 

 <table width="235px" cellspacing="0" cellpadding="0" border="0">

 <!--  <tr align="center">
 <td style="padding: 5px 40px 0px 40px;">


 <input class="crtordbtn" type="button" value="eSysco Express" id="esyscoExpress" onClick="parent.location.href='http://flex2.esysco.net';" />
 </td>
 </tr>
 <tr >
 <td style="padding: 5px 40px 0px 40px;text-align:left">
 <p>Our latest order management application with improved performance and enhanced usability</p>
</td>
</tr>-->

<tbody><tr align="center">

    <td style="padding: 5px 40px 0px 40px;">

            <input class="crtordbtn" type="button" value="Market Express" id="MarketExpress" onclick="parent.location.href='/OMAPX?userId=051220665&amp;clientId=8&amp;UserType=null&amp;BuyerCookie=null';">


    </td></tr>
    <tr>
    <td style="padding: 5px 40px 0px 40px;text-align:left">
        <p>Our latest order management application with improved performance and enhanced usability</p>
    </td></tr>
    <tr>



</tr>

</tbody></table>
 </div>

</div>

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    所需元素是动态元素,因此要定位元素,您必须诱导 WebDriverWait 以使 元素可点击,您可以使用以下任一解决方案:

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.crtordbtn#MarketExpress[onclick*='OMAPX?userId']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='crtordbtn' and @id='MarketExpress'][contains(@onclick, 'OMAPX?userId')]"))).click()
      
    • 注意:您必须添加以下导入:

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

    【讨论】:

    • 动态元素的最佳方式是WebDriverWait!
    • 感谢您的回复。尝试 CSS_SELECTOR 方法时收到错误消息:selenium.common.exceptions.WebDriverException:消息:无法解码来自木偶的响应,XPATH 也出现相同的错误。
    【解决方案2】:

    试试这个。它应该可以工作。

    driver.find_element_by_xpath("//table[@id='esyscoExpress']/tbody/tr//input[@class='crtordbtn']").click()
    

    【讨论】:

    • 遇到同样的错误:消息:无法定位元素://input[@class='crtordbtn']
    • 那么它必须在任何框架或表格下可以请检查任何框架内存在的输入标签
    • 很抱歉,如何检查任何框架内的输入标签?
    • 如果你去你的 html 源代码搜索 iframe。
    • 但是我已经在我的机器上测试了你的 html 输入并且它正在使用我的代码。这就是为什么我想知道那里有任何 iframe。
    【解决方案3】:

    也许尝试使用 id 会起作用。希望对你有帮助

    driver.find_element_by_id("MarketExpress").click()
    

    【讨论】:

    • 很遗憾,它也找不到 ID。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多