楼主: 时光永痕
578 0

[数据挖掘新闻] 如何使用Python处理常见的硒挑战? [推广有奖]

  • 0关注
  • 14粉丝

svip3

学术权威

12%

(VIP/贵宾)三级

63%

威望
0
论坛币
26 个
通用积分
49.7576
学术水平
4 点
热心指数
4 点
信用等级
4 点
经验
34070 点
帖子
2731
精华
0
在线时间
316 小时
注册时间
2020-7-21
最后登录
2024-4-28

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
如何使用Python处理常见的硒挑战?
最近,我想到了将Selenium与Python结合使用以自动执行客户端上SAP上某些重复性任务的过程。而且,在经常接触代码的情况下,我开始遇到一些从未见过的挑战。我花了很多时间在互联网上尝试为每个问题找到最合适的解决方案,然后我对自己说:
如果我发现我需要的所有东西都聚集在一个地方,可以使用了,那将是多么美好的一天?
因此,为了使您的生活更轻松, 我在本文中汇总了用户在使用Selenium以及准备使用Python编写的代码片段时可能遇到的最常见挑战的答案。
PS:如果您还不熟悉Selenium基础知识,可以先阅读我们的Selenium入门文章。
现在让我们直接采取行动!
如何使用Selenium WebDriver下载文件
使用Selenium自动化导航时,可能需要下载文件。问题是,一旦我们选择并单击下载链接,就会弹出一个本机对话框窗口,需要手动干预。Selenium无法控制浏览器的文件下载窗口,无法完成下载过程。幸运的是,总有其他选择。
要变通解决此问题,您可以授予浏览器授权以事先自动下载文件并设置默认的下载文件位置。这可以通过为WebDriver配置文件设置首选项来完成(以下代码用于Firefox浏览器,您可能需要对其进行调整才能使其在其他浏览器上运行):
导入操作系统
download_dir = os.getcwd()#当前工作目录
配置文件= webdriver.FirefoxProfile()
profile.set_preference(“ browser.download.folderList”,2)#当browser.download.folderList等于2时启用了指定的自定义位置browser.download.dir。
profile.set_preference('browser.download.dir',download_dir)
profile.set_preference(“ browser.download.manager.showWhenStarting”,False)
profile.set_preference(“ browser.download.dir”,路径)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk',CONTENT_TYPE)
profile.set_preference(“ webdriver_enable_native_events”,False)
profile.set_preference(“ browser.download.manager.scanWhenDone”,False)
profile.set_preference(“ browser.download.manager.useWindow”,False)
profile.set_preference(“ browser.helperApps.alwaysAsk.force”,False)
profile.update_preferences()
浏览器= webdriver.Firefox(firefox_profile = profile)
您可能已经注意到 CONTENT_TYPE 需要替换的变量。它实际上对应于您要下载的文件的MIME类型。如果您不熟悉此术语,则MIME类型只是用于识别Internet上内容数据类型的标识符。它在Internet上的作用与文件扩展名在操作系统上的作用相同。
为了简化您的工作,我从Mozilla的网络文档中删除了最常见扩展名的MIME类型,以便于访问。在下面的小部件中,您将找到用于获取与文件扩展名相对应的内容类型的代码。您可以使用控制台立即尝试!
图形界面检索MIME类型
您可以通过从上面的小部件中复制粘贴或从Github下载来获取JSON文件。
现在,您的WebDriver应该可以完成下载而无需征求许可或显示任何对话框窗口 ??
如何使用Selenium WebDriver上传文件
在某些情况下,您可能需要使用Selenium上传文件。就像在下载场景中一样,问题在于,当您单击文件上载按钮时,通常会弹出一个本机对话框窗口。
Selenium无法控制您的浏览器的文件上传窗口,一旦弹出,执行就会被中断。好消息是,有一些方法可以使用Python处理:
解决方案1
第一个解决方案(也是最简单的)是使用send_keys():
导入操作系统
从硒导入webdriver
从selenium.webdriver.common.keys导入密钥
从webdriver_manager.firefox导入GeckoDriverManager
url =“ my_url”
浏览器= webdriver.Firefox(executable_path = GeckoDriverManager()。install())
browser.get(URL)
my_path = os.getcwd()
file_name =“ MY_FILE_NAME”
input_file_xpath =“ my_xpath”
full_path = os.path.join(my_path,文件名)
browser.find_element_by_xpath(input_file_xpath).send_keys(完整路径+ Keys.RETURN)
解决方案2
不幸的是,在某些情况下,根据网站的设计方式,您可能会引发以下错误:“键盘无法访问元素”。不用担心,您可能无法使用send_keys直接发送路径,但是有一些解决方法。其中之一使用的是AutoIt库,您可以通过在命令行中键入以下内容进行安装:
点安装-U pyautoit
然后,您需要做的是:
导入自动
dialog_window_title =“文件上传”
browser.find_element_by_xpath(input_file_xpath).click()
autoit.win_active(dialog_window_title)
autoit.control_send(dialog_window_title,“ Edit1”,full_path)
autoit.control_send(dialog_window_title,“ Edit1”,“ {ENTER}”)
不要忘了用dialog_window_title您自己的对话框窗口标题替换变量的内容:
在Firefox上与Selenium WebDriver一起使用的文件上传窗口
作者截图
如果您想测试该解决方案,请访问以下网站进行图像类型转换,第一个解决方案无法在该网站上进行:online-convert。只需将MY_FILE_NAME上面的代码替换为图像文件名并执行??
如何使用Selenium WebDriver打开多个选项卡并浏览它们
在浏览互联网时,我们自然会比打开新窗口更频繁地打开多个选项卡。使用Selenium自动导航时,也需要使用此功能。实际上,在某些情况下,单击链接或特定按钮会在新选项卡中打开URL,这意味着有必要切换到新选项卡以继续。
幸运的是,Selenium已经针对此场景进行了所有计划。如果希望在选项卡之间切换,则可以使用两种方法和两种属性进行救援:
current_window_handle:Selenium WebDriver属性(或更具体地说是一个属性),用于存储当前活动窗口的ID
window_handles:一个Selenium WebDriver属性,该属性存储浏览器中打开的所有选项卡的窗口ID
switch_to.window():Selenium WebDriver方法,用于切换到其ID作为参数传递的窗口
close():用于关闭当前选项卡的Selenium WebDriver方法
您可以在下面找到一个示例代码片段,在其中,我使用上面的所有信息来浏览多个选项卡。我们将启动Medium主页,打开其他三个选项卡,然后浏览它们以打印其名称,然后关闭所有内容:
导入时间
从硒导入webdriver
从selenium.webdriver.common.keys导入密钥
从selenium.webdriver.support导入EC的预期条件
来自selenium.webdriver.common.by导入方式
从selenium.webdriver.support.wait导入WebDriverWait
从webdriver_manager.firefox导入GeckoDriverManager
浏览器= webdriver.Firefox(executable_path = GeckoDriverManager()。install())
browser.get('https://medium.com')
等待= WebDriverWait(浏览器,10)
结果= wait.until(
    EC.presence_of_element_located((By.XPATH,'/ html / body / div / div / div / div [3] / div / div [1] / div / div / div / div [3]')))
#中型主页导航栏上的前三个链接
链接= results.find_elements_by_tag_name('a')[:3]
#通过在元素上发送以下按键来在新选项卡中打开链接:Keys.CONTROL + Keys.RETURN
对于链接中的链接:
    link.send_keys(Keys.CONTROL + Keys.RETURN)
    time.sleep(1)
#获取当前标签
current_tab = browser.current_window_handle
#获取所有标签的列表
标签= browser.window_handles
对于标签中的标签:
    #将焦点一一切换到每个打开的标签页
    如果制表符!= current_tab:
        #切换到标签
        browser.switch_to.window(标签)
        time.sleep(1)
        #获取标签名
        标题= browser.title
        #关闭当前标签
        打印(标题为“ {title}”的“关闭标签”)
        browser.close()
browser.switch_to.window(current_tab)
无法访问的元素:满足iFrame
您是否曾经尝试过将元素id与Selenium一起使用来选择元素,但还是有一个NoSuchElementException?您尝试了从XPath到CSS选择器的所有操作,仍然找不到看起来很容易达到的元素?嗯,您的问题很可能与iframe有关。
一个IFRAME只是显示另一个HTML页面到当前的HTML标签。并且由于它包含另一个HTML页面,所以硒无法到达其中的任何元素,除非您切换到它。
如果您从未遇到过iframes,例如,您可以在中等文章中找到嵌入它们的元素,例如Github Gists。
让我们看看如何用一个例子来应对!我们将首先使用Selenium打开一篇中等文章:
从硒导入webdriver
从webdriver_manager.firefox导入GeckoDriverManager
浏览器= webdriver.Firefox(executable_path = GeckoDriverManager()。install())
出版物=“ https://medium.com/python-in-plain-english
article_name =“ master-selenium-webdriver-with-python-in-10-minutes”
browser.get(f“ {publication} / {article_name} -8affc8b931c”)
现在请注意,如果您尝试在要点内选择一个元素,则会出现错误:
password_xpath =“ / html / body / div / div / div / div [1] / div / div / div / table / tbody / tr [10] / td [2] / span [3]”
element = browser.find_element_by_xpath(password_xpath)#引发NoSuchElementException
首先让我们找到iframe的XPath。您可以按照以下示例进行操作:
在Firefox上查找Iframe XPath for Selenium WebDriver的演示
作者截图
为了避免NoSuchElementException,我们应该在选择元素之前切换到包含它的框架:
frame_xpath =“ / html / body / div / div / div / div [3] / article / div / section [2] / div / div / figure [2] / div / div / iframe”
password_xpath =“ / html / body / div / div / div / div [1] / div / div / div / table / tbody / tr [10] / td [2] / span [3]”
框架= browser.find_element_by_xpath(frame_xpath)
browser.switch_to.frame(frame)
密码= browser.find_element_by_xpath(password_xpath).text
如果要返回到原始HTML文档,则应切换为default_content:
browser.switch_to.default_content()
请注意,在切换到iframe之前,还建议先切换到default_content,以确保您使用的是正确的引用(尤其是在处理多个框架时)!
现在,存在一种更方便的方法,可确保框架可用于切换并避免任何异常!它是通过使用expected_condition完成:frame_to_be_available_and_switch_to_it !
现在,如果您不知道期望的条件是什么,我们将在本系列的第二部分中讨论它们。我们将解释它们是什么以及如何创建自己的定制期望条件!
现在,让我们看看如何使用它们:
来自selenium.webdriver.common.by导入方式
从selenium.webdriver.support导入EC的预期条件
browser.switch_to.default_content()
预期条件= EC.frame_to_be_available_and_switch_to_it((By.XPATH,frame_xpath))
WebDriverWait(浏览器,2)。直到(expected_condition)
密码= browser.find_element_by_xpath(password_xpath).text
browser.switch_to.default_content()
最后要注意的是,存在另一个HTML元素,其行为与iframe相似。它是HTML5不再支持的frame标签,但是您仍然可以在较旧的网站上看到它们。
最后的想法
使用Selenium时,无论熟练程度如何,任何人都仍然会面临挑战。我希望这个故事能帮助您中那些最经常遇到的硒挑战的解决方案,并为他们节省大量的研究时间。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Python处理 python 如何使用 Publication Preferences

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-3 22:41