• [技术干货] 涉及网络请求命令的全局代理配置指导
    一、使用背景有一些命令的使用上涉及到网络请求,如果运行环境上配置有网络代理,就会因为相关代理问题导致原有请求失败。这时就需要将相关网络代理信息配置到脚本项目中,使相关命令的网络请求带上代理信息,从而请求成功。二、涉及的命令1、OnlineOcrAutoForm, SetOnlineOcrWindow3.3.0版本及以上的Studio中基于在线OCR的自动化部分下的OnlineOcrAutoForm(在线OCR智能表单)SetOnlineOcrWindow(设置在线OCR操作窗口)2、inform.sendSmsHic, inform.voiceCallHic, eSpace.sendMessage3.3.0版本及以上的Studio中华为内部模块消息部分的inform.sendSmsHic(发送短信)inform.voiceCallHic(语言电话)eSpace.sendMessage(使用eSpace应用号发送信息)3、CV.setWindow3.3.0版本及以上的Studio中基于机器视觉自动化模块的通用CV部分的CV.setWindow(设置CV目标窗口)4、Manas引擎部分所有命令3.3.0版本及以上的Studio中人工智能模块Manas引擎部分所有命令图像识别:getpicinfo_online、getIdCardInfoOcr、getTrainTicketInfoOcr、getVatInfoOcr、getMarriageCertificateInfoOcr、getTableInfoOcr自然语言处理:textSegmentationNLP、textKeyWordsNLP、textSimilarityNLP5、企业微信部分所有命令3.3.0版本及以上的Studio中社交软件模块企业微信部分所有命令qywx.get_accesstoken、qywx.send_text_msg、qywx.send_textcard_msg、qywx.send_file_msg、qywx.send_video_msg6、基于selenium驱动创建的浏览器2.18版本及以上的Studio中为selenium驱动创建的浏览器配置网络代理UI通用处理(不建议使用)模块网页部分的命令三、全局代理配置在Studio全局变量中的第一行配置一个类型为Object,名称为ProxyParameter的变量变量值的格式如下:{ "proxy_user": "user_account", "proxy_pwd": "password", "proxy_host": "proxy.host.com", "proxy_port": "1234" }说明:proxy_user、proxy_pwd表示账号和密码proxy_host表示的是代理服务器域名,不包含http协议的前缀proxy_port表示代理服务器的端口
  • [技术干货] python+selenium 实现扫码免密登录示例代码【转】
    目录一、需求描述二、首先扫码登录获取cookies保存到本地未后面免密登录做准备三、初始化浏览器四、获取本地保存的cookies实现登录一、需求描述web 自动化测试/python爬虫往往会遇到扫码登录的情况,不是所有的网站都支持用户密码登录,遇到这种扫码登录的情况会阻碍我们自动化测试/爬虫的进行,所有为了可以顺畅的进行我们的需求,在进行自动化或者爬虫前我们首先要解决扫码登录的问题,下面讲解如何实现扫码免密登录。二、首先扫码登录获取cookies保存到本地未后面免密登录做准备具体实现代码如下:12345678910111213141516def get_cookies():    # 首先获取cookies保存至本地    driver = webdriver.Chrome('/Users/xxx/Documents/python/pack/chromedriver/chromedriver')    page_url = 'https:/xxx/38268919/bugtrace/buglists/query/1/created/desc?query_token=20220706291334df28c613a85aa589f04376d034'    driver.get(page_url)    driver.maximize_window()    # 进行扫码登录    time.sleep(20)    # 获取列表形式的cookies    cookies = driver.get_cookies()    # 转换成字符串保存    jsonCookie = json.dumps(cookies)    # 保存到txt文件    with open('cookies.txt','w') as f:        f.write(jsonCookie)    print('cookies保存成功!')三、初始化浏览器123456def browser_initial():    driver = webdriver.Chrome('/Users/xxx/Documents/python/pack/chromedriver/chromedriver')    page_url = 'https://xxx/38268919/bugtrace/buglists/query/1/created/desc?query_token=20220706291334df28c613a85aa589f04376d034'    driver.get(page_url)    driver.maximize_window()    return driver四、获取本地保存的cookies实现登录代码实现如下123456789101112131415161718def login(driver):    with open('cookies.txt','r',encoding='utf8') as f:        cookies = json.loads(f.read())    # 给浏览器添加cookies    for cookie in cookies:        cookie_dict = {            'domain': '.tapd.cn',            'name': cookie.get('name'),            'value': cookie.get('value'),            "expiry": 1658386136,            'path': '/',            'httpOnly': True,            'Secure': True        }        # print(cookie_dict)        driver.add_cookie(cookie_dict)    # 刷新网页,cookies才会成功    driver.refresh()12345if __name__ =='__main__': driver=browser_initial() login(driver)
  • [分享交流] 通过爬虫中的selenium控制chrome,Firefox等浏览器自动操作获取相关信息
    1. 首先将我们需要的selenium的包导入 from selenium.webdriver import Chrome(如果使用chrome浏览器就导入chrome,如果使用别的浏览器则将名称换掉即可) 2. 创建浏览器对象 web = Chrome() 3. 打开浏览器 web.get("http://www.baidu.com")(此处以百度举例) 4. 找到某个元素. 点击它 el = web.find_element_by_xpath('此处是xpath的地址')(xpath不了解的可以看我之前的博客) el.click() # 点击事件 5. 查找某些元素时,我们需要掌握前后端的一些知识,我们可以通过element,class_name,id,tag_name等,主要视情况而定 - 6.当执行点击事件时,我们需要导入Keys from selenium.webdriver.common.keys import Keys - 7.浏览器窗口之间的切换 web.switch_to.window(web.window_handles[-1]) 表示的是网页栏最后一个网页 web.switch_to.window(web.window_handles[0]) 表示的是网页栏第一个网页以下讲的是当网页中存在iframe的网页内嵌的时候:我们先找到iframe的网址然后进行切换 web.get("") # 处理iframe的话. 必须先拿到iframe. 然后切换视角到iframe . 再然后才可以拿数据 iframe = web.find_element_by_xpath('iframe的地址') web.switch_to.frame(iframe) # 切换到iframe web.switch_to.default_content() # 切换回原页面无头浏览器的应用# 准备好参数配置 opt = Options() opt.add_argument("--headless") opt.add_argument("--disable-gpu") web = Chrome(options=opt) # 把参数配置设置到浏览器中
  • [技术干货] Selenium WebDriver中的XPath:完整教程
    作者:姚旺时间:2021.6.1在Selenium 自动化中,如果id、name、classname等常规定位器没有找到元素,那么就需要使用XPath在web页面上查找元素。在本教程中,我们将学习用xpath表达式查找复杂或动态元素。在本教程中,您将学习:1.0 XPath是什么?2.0 Xpath类型    2.1 Absolute XPath    2.2 Relative Xpath3.0 在Selenium中使用XPath处理复杂和动态元素    3.1 XPath基础    3.2 Contains()    3.3 OR & AND    3.4 Starts-with function    3.5 Text()    3.6 XPath轴方法       3.6.1 Following       3.6.2 Ancestor       3.6.3 Child       3.6.4 Preceding       3.6.5 Following-sibling       3.6.6 Parent       3.6.7 Descendant1.0 XPath是什么?XPath被定义为XML路径。它是一种使用XML路径表达式查找web页面上的任意元素的语法。XPath用于在HTML DOM网页结构中查找任意元素的位置,下面的截图展示了XPath的基本格式。XPath的语法:XPath包含位于web页面的元素的路径。创建XPath的标准语法是:Xpath=//tagname[@attribute='value']•  // :选择当前节点•  Tagname:节点名/标签名•  @:选择属性•  Attribute:节点下的属性名•  Value:属性值 为了准确地找到网页上的元素,有不同类型的定位器:Xpath定位器在网页上找到不同的元素ID按元素的ID查找元素Classname按元素的类名查找元素Name按元素名称查找元素Link text按链接的文本查找元素XPath查找动态元素CSS pathCSS path也可以定位没有名称、类或ID的元素。2.0 Xpath类型XPath定位分为两种类型:  1)    Absolute XPath(绝对定位)  2)    Relative XPath(相对定位)2.1 Absolute XPath绝对定位是找到元素最直接方法,但是绝对定位的缺点是,如果该元素在HTML DOM结构中的路径做了任何更改,那么XPath定位就会失败。绝对定位的关键特征是它以单正斜杠(/)开始,这意味着您必须从根节点开始选择元素(在html中以/html开始)。下面截图是元素的绝对定位表达式的示例。以华为商城登录页面为例(https://id1.cloud.huawei.com/CAS/portal/loginAuth.html)Absolute xpath: /html/body/div[1]/div[2]/div/div/div[1]/div[3]/span[3]/div[1]/span/div[2]/div[2]/div/input★ 定位说明及建议:在Chrome中,按下F12启动控制台,点击控制台左侧的小箭头,选择需要定位的元素,选中元素后,控制台会自动滚动到该元素标签在当前html中的位置,且该标签会处于高亮状态,右键该标签-选择”Copy”—“Copy full Xpath”即可获取元素的绝对定位。此时在控制台中按下Ctrl+F,将我们获取到的绝对定位粘贴到输入栏,在这里我们可以验证Xpath定位是否准确,以及定位到的元素的个数。通常情况下,绝对定位的xpath路径较长,如果该元素所处的html结构发生变化,那么XPath定位就会失败。另外,程序在解析绝对定位是需要层层筛查,检索会比较慢。所以,一般情况下,不建议使用绝对定位。 2.2 Relative Xpath相对定位的路径从HTML DOM结构的中间开始。它以双斜杠(//)开始,这意味着它可以在网页的任何地方搜索该元素。您可以从HTML DOM结构的中间开始,不需要编写长段的xpath。下面截图是相同元素的相对XPath表达式的示例。这是通过相对定位查找元素时使用的常见格式。Relative xpath: //input[@class="hwid-input hwid-cover-input userAccount"]★ 定位说明及建议:相对定位需要手动编写xpath(属性和属性值可以双击控制台中元素的属性进行复制)。相对定位可以从需要定位的元素开始编写xpath,通常你可以通过标签名+属性+文本这三个维度去定位元素,如果该元素不止一个,可以继续向其父元素、祖先元素追加定位(也可以通过兄弟元素定位),或增加属性、文本。如案例中,如果上例xpath找到的元素不止一个,可以写成//div[@class="hwid-input-wrap"]//input[@class="hwid-input hwid-cover-input userAccount"]、//input[@class="hwid-input hwid-cover-input userAccount"][@placeholder="手机号/邮件地址/华为号"]或//input[@class="hwid-input hwid-cover-input userAccount" and @placeholder="手机号/邮件地址/华为号"] 3.0 在Selenium中使用XPath处理复杂和动态元素3.1 XPath基础XPath表达式根据ID、Name、Classname等属性从XML文档中选择节点或节点列表,如下所示。Xpath=//input[@name='uid']下面是访问页面的链接https://id1.cloud.huawei.com/CAS/portal/loginAuth.html(华为商城登录页面)一些基础的xpath表达式:Xpath=//input[@type="password"]Xpath= //*[@placeholder="密码"]Xpath= //i[@class="hwid-password-eye hwid-password-eyeoff-disable"]XPath= //img[@alt="Scan me!"] 3.2 Contains()Contains()是XPath表达式中常用的方法。它用于任何属性的值动态变化,可以通过包含特性找到带有部分文本的元素,如下面的示例所示。在本例中,我们尝试通过使用属性的部分文本值来定位元素。在下面的XPath表达式中,使用部分值“pass”代替“password”,可以看到元素被成功地找到了。“Type”的完整值是“password”,但只使用部分值“pass”。Xpath=//input[contains(@type,'pass')]'class'的完整值是'hwid-input hwid-input-pwd',但只使用部分值'hwid-input '。Xpath=//input[contains(@class,'hwid-input')]在上面的表达式中,我们使用'class'作为属性,'hwid-input'作为部分值,如下面的屏幕截图所示。这将找到三个元素,因为它们的“class”属性都含有“hwid-input”。类似地,在下面的表达式中,我们将“文本”作为属性,而“验证码”作为部分值,如下面的截图所示。Xpath=//span[contains(text(),'验证码')]3.3 OR & AND在OR表达式中,使用了两个条件,无论是第一个条件还是第二个条件都应该为真。它也适用于任何条件为真或两者皆为真。意味着任何一个条件都必须为真才能找到元素。在下面的XPath表达式中,它定位了单个条件或两个条件都为真的元素。Xpath=//*[@type="password" or contains(@class,"hwid-cover-input")]突出显示两个元素“type” 属性为“password”和“class”属性含有“hwid-cover-input”。在AND表达式中,使用了两个条件,两个条件都必须为真才能找到元素。如果任何一个条件为假,则无法找到元素。Xpath=//*[@type="text" and contains(@class,"hwid-cover-input")]在下面的表达式中,突出显示“input”元素,因为它同时具有“type”和“class”属性。3.4  Starts-with functionStart-with方法常用于查找在网页上动态变化的元素。在这个表达式中,通过匹配元素属性值的起始文本来查找属性动态变化的元素。您还可以找到其属性值为静态(而不是动态)的元素。假设特定元素的ID动态变化如下:Id=" message12"Id=" message345"Id=" message8769"等等;但是起始的字符是一样的。在本例中,我们使用start-with表达式。Xpath=//*[starts-with(@Id,'message')]XPath查找那些“ID”属性以“message”开头的元素。3.5 Text()在这个表达式中,通过text()方法,我们可以找到与精确文本匹配的元素,如下所示。在本例中,我们找到文本为“登录”的元素。Xpath= //span[text()='登录']3.6 XPath轴方法什么是XPath轴?轴表示与上下文节点的关系,XPath轴从当前上下文节点搜索XML文档中的不同节点。如果普通XPath方法没有ID、类名、名称等,则无法找到这些动态元素,而XPath轴是用于查找动态元素的方法。在Selenium Webdriver中常用的轴方法有:child、parent、ancestor、sibling、prior、self等。这些XPath轴方法用于查找复杂或动态的元素。下面我们将看到其中的一些方法。为了演示这些XPath轴方法,我们将使用华为商城登录页面作为演示站点。3.6.1 Followingfollowing选取文档中当前节点的结束标签之后的所有节点,包含同一文档中按文档顺序位于上下文节点之前的所有节点,除了祖先节点。如下面的屏幕所示。Xpath=//*[@type='text']//following::input从结果上我们可以知道“账号输入框”元素结束之后,页面中还有两个input标签。如果想要选择任何特定元素,可以使用下面的XPath方法:Xpath=//*[@class="hwid-input hwid-cover-input userAccount"]//following::input[1]您可以根据需求更改XPath,添加[1]、[2]、[@attribute=’value’]……等等。在输入为“1”的情况下,就会定位到“密码输入框”元素的特定节点。3.6.2 Ancestorancestor轴选择当前节点的所有祖先元素(祖父、父等),如下图所示。在下面的表达式中,我们正在查找当前节点(“input(密码输入框)”节点)的祖先元素。Xpath=//input[@type="password"]//ancestor::div 有11个“div”节点通过使用“祖先”轴匹配。如果您想关注任何特定的元素,那么您可以使用下面的XPath,其中根据您的需求更改数字1,2:Xpath=//*[text()='Enterprise Testing']//ancestor::div[1]您可以根据需求更改XPath,添加[1]、[2]、[@attribute=’value’]……等等 3.6.3 Child选择当前节点的所有子元素,如下面的截图所示。Xpath=//div[@class="hwid-pwdlogin-root"]//child::input使用“child”轴匹配3个“input”节点。如果您想关注任何特定的元素,那么可以使用下面的xpath:Xpath=//*[@id='java_technologies']/child::li[1]您可以根据需求更改xpath,添加[1]、[2] 、[@attribute=’value’]……等等 3.6.4  Preceding选择当前节点之前的所有节点,如下面的截图所示。在下面的表达式中,它标识了“短信验证码登录”标签之前的所有的input元素。//span[text()='短信验证码登录']//preceding::input使用“preceding”轴匹配2个“input”节点。如果您想定位任何特定的元素,那么可以使用下面的XPath:Xpath=//span[text()='短信验证码登录']//preceding::input[last()]----选中“密码输入框”。您可以根据需求更改xpath,添加[1]、[2] 、[@attribute=’value’]……等等。 3.6.5 Following-sibling选择该节点以下的上下文节点的兄弟节点。兄弟节点与当前节点处于同一级别,如下面的屏幕所示。它将在当前节点之后查找元素。xpath=//a[@id="foot_EULA"]//following-sibling::a使用“following-sibling”轴匹配2个“a”节点。如果您想定位任何特定的元素,那么可以使用下面的XPath:Xpath=//a[@id="foot_EULA"]//following-sibling::a [1]----选中“关于华为账号与云控件隐私声明”。您可以根据需求更改xpath,添加[1]、//tagName、[@attribute=’value’]……等等。 3.6.6 Parent选择当前节点的父节点,如下面的屏幕所示。Xpath=//a[@id="foot_EULA"]//parent::p★ 定位说明及建议:Parent轴方法通常用于根据子元素来定位父元素,获取父元素相关属性或文本。另外,上面的xpath定位Xpath=//a[@id="foot_EULA"]//parent::p等价于Xpath= (//a[@id="foot_EULA"])/..您可以根据需求更改XPath,添加//tagName……等等。 3.6.7  Descendant选择当前节点的后代节点,如下面的屏幕所示。在下面的表达式中,它标识了当前元素的所有后代元素,这意味着在节点的下面(子节点,孙子节点,等等)。Xpath=//*[@id='rt-feature']//descendant::a使用“descendant”轴匹配4个“a”节点。如果您想定位任何特定的元素,那么可以使用下面的XPath:Xpath=//div[@class="warrant-area"]//descendant::a[2]您可以根据需求更改XPath,添加[1]、//tagName、[@attribute=’value’]……等等。 在实际定位过程中,经常会碰到的问题及技巧:1.有时候我们用id去定位,但是运行依然找不到元素,可以观察id是否是变化的(通常id属性值含有一串无规律的数字即可怀疑是可变的),刷新页面,就能观察到id是否是变化的,对于动态的id,我们需要选择用其它属性去定位。2.需要定位的元素在下拉选择框中,我们在Chrome中可以用Ctrl+Shift+C,点击元素进行定位。点击需要定位的元素所在的下拉选择框,将鼠标悬浮于选择框中,按下“Ctrl+Shift+C”组合键,点击需要定位的元素,即可对元素进行定位。如下图: