使用 WebDriverWait 时无法定位元素和 TimeoutException
Unable to locate element and TimeoutException when WebDriverWait is used
我正在尝试自动点击页面底部的 "SHOW MORE" 按钮以获取所有评论。
但是,我在定位它时遇到了一些问题,如果你能帮助我,我将不胜感激。
我尝试了几种方法,但我不确定为什么 none 它们有效。
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) 当遇到此类错误时,我遇到了另一个关于更改框架的问题,但似乎我没有可以切换到的框架(如果我错了请纠正我)
这是页面的url: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>
抱歉拖了这么久post,感谢您的帮助! :)
因为元素是JavaScript enabled element so to click()
it you need to induce WebDriverWait for the element_to_be_clickable()
and you can use the following :
使用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
您的 yDmH0d
、fcxH9b
等似乎是动态生成的,并且每次您 load/reload 页面时都会更改。唯一不变的是 span
标签文本。
所以我建议使用以下简单的选择器:
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//span[text()='Show more']"))).click()
还可以考虑使用 Page Object Model 设计模式,这将使您在测试支持方面更轻松 when/where UI 更改并让您更快地编写测试。
如有需要,请参阅 Page Objects page of Selenium Python documentation 了解更多信息。
我正在尝试自动点击页面底部的 "SHOW MORE" 按钮以获取所有评论。
但是,我在定位它时遇到了一些问题,如果你能帮助我,我将不胜感激。
我尝试了几种方法,但我不确定为什么 none 它们有效。
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) 当遇到此类错误时,我遇到了另一个关于更改框架的问题,但似乎我没有可以切换到的框架(如果我错了请纠正我)
这是页面的url: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>
抱歉拖了这么久post,感谢您的帮助! :)
因为元素是JavaScript enabled element so to click()
it you need to induce WebDriverWait for the element_to_be_clickable()
and you can use the following
使用
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
您的 yDmH0d
、fcxH9b
等似乎是动态生成的,并且每次您 load/reload 页面时都会更改。唯一不变的是 span
标签文本。
所以我建议使用以下简单的选择器:
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.XPATH, "//span[text()='Show more']"))).click()
还可以考虑使用 Page Object Model 设计模式,这将使您在测试支持方面更轻松 when/where UI 更改并让您更快地编写测试。
如有需要,请参阅 Page Objects page of Selenium Python documentation 了解更多信息。