使用WebDriverWait时无法找到元素和TimeoutException

时间:2019-06-11 06:42:06

标签: python-3.x selenium xpath webdriverwait xpath-1.0

我正在尝试自动单击页面底部的“ SHOW MORE”按钮,以获取所有评论。

但是,我在查找它时遇到了一些问题,如果您能帮助我,我将非常感谢。

我尝试了几种方法,但是我不确定为什么它们都不起作用。

1)方法1:CSS选择器

driver.find_element_by_css_selector("U26fgb.O0WRkf.oG5Srb.C0oVfc.n9lfJ.M9Bg4d")

导致:

NoSuchElementException: Message: no such element: Unable to locate element

2)方法2:XPath Helper(Chrome上的扩展程序)

driver.find_element_by_xpath("/html/body[@id='yDmH0d']/div[@id='fcxH9b']/div[@class='WpDbMd']/c-wiz[@class='zQTmif SSPGKf I3xX3c drrice']/div[@class='T4LgNb']/div[@class='ZfcPIb']/div[@class='UTg3hd']/div[@class='JNury Ekdcne']/div[@class='LXrl4c']/div/div[@class='W4P4ne ']/div[2]/div[@class='PFAhAf']/div[@class='U26fgb O0WRkf oG5Srb C0oVfc n9lfJ']/span[@class='CwaK9']/span[@class='RveJvd snByac']")

导致与上述相同的错误。

3)方法3:WebDriverWait

我阅读了与此相关的其他堆栈溢出问题,并尝试使用WebDriverWait,这是我的代码:

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "/html/body[@id='yDmH0d']/div[@id='fcxH9b']/div[@class='WpDbMd']/c-wiz[@class='zQTmif SSPGKf  I3xX3c drrice']/div[@class='T4LgNb']/div[@class='ZfcPIb']/div[@class='UTg3hd']/div[@class='JNury Ekdcne']/div[@class='LXrl4c']/div/div[@class='W4P4ne ']/div[2]/div[@class='zc7KVe']/div[@class='d15Mdf bAhLNe']/div[@class='xKpxId zc7KVe']/div[@class='bAhLNe kx8XBd']/span[@class='X43Kjb']"))).click()

但遇到TimeoutException

4)遇到此类错误时,我遇到了另一个有关更改框架的问题,但似乎我没有框架可以切换(如果我错了,请纠正我)

这是页面的网址:https://play.google.com/store/apps/details?id=com.Daylight.EzLinkAndroid&hl=en_SG

我遇到问题的HTML如下:

<div class="PFAhAf" jscontroller="XO1Ihd" jsaction="JIbuQc:bRsdTc(i3y3Ic);">
      <div role="button" class="U26fgb O0WRkf oG5Srb C0oVfc n9lfJ M9Bg4d 
         j7nIZb" jscontroller="VXdfxd" jsaction="click:cOuCgd; 
         mousedown:UX7yZ; mouseup:lbsD7e; mouseenter:tfO1Yc; 
         mouseleave:JywGue; focus:AHmuwe; blur:O22p3e; 
         contextmenu:mg9Pef;touchstart:p6p2H; touchmove:FwuNnf; 
         touchend:yfqBxc(preventMouseEvents=true|preventDefault=true); 
         touchcancel:JMtRjd;j9grLe:.CLIENT;HUObcd:.CLIENT" jsshadow="" 
         jsname="i3y3Ic" aria-disabled="false" tabindex="0">
               <div class="Vwe4Vb MbhUzd" jsname="ksKsZd" style="top: 17.2px; 
                     left: 70.225px; width: 98px; height: 98px;"></div>
               <div class="ZFr60d CeoRYc"></div><span jsslot="" class="CwaK9"> 
             <span class="RveJvd snByac">Show more</span>
             </span>
      </div>
</div>

很长的帖子,很抱歉,谢谢您的帮助! :)

2 个答案:

答案 0 :(得分:1)

您的yDmH0dfcxH9b等似乎是动态生成的,并且每次您加载/重新加载页面时都会更改。唯一不变的是span标签文本。

所以我建议使用以下简单选择器:

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//span[text()='Show more']"))).click()

enter image description here

还可以考虑使用Page Object Model设计模式,它可以在UI更改的地方/地方简化测试支持,使您的生活变得更轻松,并且可以更快地编写测试。

有关更多信息,请参见Page ObjectsSelenium Python documentation页。

答案 1 :(得分:0)

由于该元素是builtin.jq启用元素,因此对于click(),您需要为element_to_be_clickable()引入 WebDriverWait ,并且可以使用以下{{3 }}:

  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@role='button']//span/span[text()='Show more']"))).click()
    
  • 注意:您必须添加以下导入:

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