python - Selenium python,仅在某些条件下单击
问题描述
我的代码有效,但并非在所有情况下基本上功能是单击 load_more 按钮,直到它不再出现。
截至目前,我只是有一个循环,它找到加载更多按钮并单击它两次,但在某些情况下,当加载更多按钮消失时,它会单击其他东西。
我打算做一个while循环,它会不断地找到点击load_more选项,直到loadmore消失然后打破循环。
这是代码:(这只是找到并单击它两次)
load_more = browser.find_element_by_css_selector("#mainContent > div.left-panel > div > div.result-list > div > div.content")
WebDriverWait(browser, timeout).until(EC.visibility_of(load_more))
#Need bugfix,
for i in range(2):
browser.execute_script("return arguments[0].scrollIntoView(true);", load_more)
ActionChains(browser).move_to_element(load_more).click().perform()
我注意到在玩加载更多按钮时。
<div class="progressbtnwrap" data-search-type="search" style="display: block;">
当站点上存在加载更多按钮时,该元素设置为“显示:块;”
但是一旦加载更多按钮消失,
<div class="progressbtnwrap" data-search-type="search" style="display: none;">
元素变为无,注意“显示:无;”
有什么建议我可以搜索这个吗?
在查看 selenium 文档时,我找不到任何搜索此元素的方法,并专门检查样式是否被触发为无,
https://selenium-python.readthedocs.io/locating-elements.html
我的目标是创造这样的东西
while(True):
if browser.find_element_by_notsurewhat == "block":
ActionChains(browser).move_to_element(load_more).click().perform()
if browser.find_element_by_notsurewhat == "none":
break
browser.execute_script("return arguments[0].scrollIntoView(true);", load_more)
我敢肯定逻辑一定比这复杂得多,或者即使我想要实现的目标是可能的,任何建议都会很棒!
谢谢你们!
更新:
def load_more(browser):
print("I'm in the function LOAD MORE")
try:
if browser.find_element_by_xpath('//*[@id="mainContent"]/div[1]/div/div[5]/div'):
print("I HAVE ENTERED THE TRY BLOCK WITHIN THE LOAD MORE FUNCTION")
return True
except Exception as e:
print(e)
return False
return False
while load_more(browser):
print("I'm in the while loop!")
ActionChains(browser).move_to_element(load_more).click().perform()
browser.execute_script("return arguments[0].scrollIntoView(true);", load_more)
放置我的定位和单击命令时,我开始收到以下错误:
Traceback (most recent call last):
File "C:\Users\David\eclipse-workspace\Web_Scrap\setup.py", line 81, in <module>
ActionChains(browser).move_to_element(load_more).click().perform()
File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\action_chains.py", line 83, in perform
action()
File "C:\Users\David\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\common\action_chains.py", line 293, in <lambda>
Command.MOVE_TO, {'element': to_element.id}))
AttributeError: 'function' object has no attribute 'id'
我从试图找出程序崩溃的确切位置注意到,一旦运行下面的代码,程序就会崩溃,但这在将其放入 while 循环或函数之前有效。(我试图在尝试之前将 scrollIntoView, line 放在函数内,并且收到类似的错误)。
ActionChains(browser).move_to_element(load_more).click().perform()
browser.execute_script("return arguments[0].scrollIntoView(true);", load_more)
解决方案
这样做的惯用方法是使用“显式等待”(AKA WebDriverWait
with ExpectedConditions
)。
以下将等到元素不再可见。如果它在 10 秒内没有消失,TimeOutError
则会引发 a:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.invisibility_of_element_located(By.CLASS_NAME, 'progressbtnwrap'))
推荐阅读
- c++ - 为什么编译器找不到超类的方法?
- c++ - 使用 OpenCv 和 C++ 进行 Kinect V1 校准
- android - 下载质量为 1080p 的视频时,android-youtubeExtractor 中的视频没有音频
- python - Django RequestFactory 添加 HTTP_X_FORWARDED_FOR
- android - Modify circleci/android docker container
- capybara - 使用 Capybara 针对控制器方法模拟下载链接/检查链接生成
- java - How to convert UTC Date String and remove the T and Z in Java?
- python - 使用mechanicalsoup的提交功能获取“AttributeError:'str'对象没有属性'append'”
- grammar - 将 BNF 文法转换为 JavaCC
- javascript - 基于firebase身份验证限制Javascript中的路由