使用 Watir 访问 Google 组成员页面中的 table 单元格值
Access table cell values within Google Groups Member page using Watir
我希望访问网页中的 table 数据,这似乎比我见过的其他方法更难访问 posted。我担心某些 HTML 对 Watir 可见,因为如果您将页面另存为 HTML 文件,table 及其数据将不包括在内。
情况如下:
Google 群组有一个成员列表(当您以群组管理员身份查看设置时)。我想查找(或迭代)table,寻找匹配的电子邮件地址。找到后,我将 select 行(复选框),它启用 'Actions' 菜单。在操作菜单中,我会将交付设置更新为 'No email'。
我附上了会员页面的屏幕截图以及 HTML 的片段。
请 post suggestions/answers 特定于 Google 个组 table。我已经尝试了 6 种以上的其他方法,这些方法适用于更简单的 HTML 页面,但不适用于 Google 组。
谢谢
这是我尝试访问的菜单的屏幕截图。
Actions popup menu (img)
点击 'Actions' 菜单按钮获取悬停菜单前后。
之前
<div tabindex="0" role="button" class="IVILX2C-n-a jfk-button-standard IVILX2C-k-c" aria-haspopup="true" aria-controls="gwt-uid-809" aria-expanded="false" aria-disabled="false" data-title="Actions">
之后
<div tabindex="0" role="button" class="IVILX2C-n-a jfk-button-standard IVILX2C-k-c IVILX2C-n-a-selected IVILX2C-n-j" aria-haspopup="true" aria-controls="gwt-uid-809" aria-expanded="true" aria-disabled="false" data-title="Actions" aria-activedescendant="gwt-uid-819">
请注意,"gwt-uid-xxx" 值在会话之间不一致。
更新:这三行似乎可以点击 'Actions' 菜单,将鼠标悬停在 'Change delivery settings' 上,然后点击 'No email'
@driver.element(文本:'Actions').click<br>
@driver.element(文字:'Change delivery setting').hover<br>
@driver.div(class: 'popupContent', index: 1).div.div.div(text: 'No email').click
编辑:下面的代码
require 'rubygems'
require 'watir-webdriver'
require 'logger'
require 'csv'
def setup
@driver = Watir::Browser.new :chrome
# set the timeout for implicit waits
@driver.driver.manage.timeouts.implicit_wait = 5
#Create log file
if @logger.nil?
@logger = Logger.new( 'D:/Google Drive/_code/GroupsEmailSetting/ChangeDeliverySetting_log.txt',10)
@logger.level = Logger::DEBUG
@logger.datetime_format = '%Y-%m-%d %H:%M:%S%z'
end
#admin credentials
@login_user = 'someone@else.com'
@login_pwd = 'pwd!'
end
def teardown
puts "Enter to close"
a = gets.chomp
@driver.quit
@logger.close
end
def run
setup
yield
teardown
end
run do
@driver.goto "https://accounts.google.com"
element = @driver.text_field(:id => "Email")
element.send_keys(@login_user)
@driver.button(:id => "next").click
element = @driver.text_field(:id => "Passwd")
element.send_keys(@login_pwd)
@driver.button(:id => "signIn").click
@logger.info "User logged in: #{@user}"
#TEMP # find users, change email setting
@domain = 'domain.com'
@group = 'watir_table'
@user = 'someone@else.com'
@dsetting = 'No email'
@logger.info("Group & User selected: #{@group + "@" + @domain + " : " + @user}")
#END TEMP
@driver.goto "https://groups.google.com/a/domain.com/forum/#!managemembers/#{@group}/members/active"
@logger.info "Group loaded: #{@group}"
browser.span(text: 'someone@else.com').parent.parent.checkbox.click
end
这是一个非常常见的模式,如果我们有更好的方法来解决它,那就太好了。尝试这样的事情:
[email1, email2, email3].each do |email_address|
row = @driver.div(text: email_address).parent.parent
row.checkbox.click
row.div(text: 'All email').parent.parent.checkbox.click
end
browser.element(text: 'Change delivery setting').hover
browser.element(text: 'No email').click
我希望访问网页中的 table 数据,这似乎比我见过的其他方法更难访问 posted。我担心某些 HTML 对 Watir 可见,因为如果您将页面另存为 HTML 文件,table 及其数据将不包括在内。
情况如下: Google 群组有一个成员列表(当您以群组管理员身份查看设置时)。我想查找(或迭代)table,寻找匹配的电子邮件地址。找到后,我将 select 行(复选框),它启用 'Actions' 菜单。在操作菜单中,我会将交付设置更新为 'No email'。
我附上了会员页面的屏幕截图以及 HTML 的片段。
请 post suggestions/answers 特定于 Google 个组 table。我已经尝试了 6 种以上的其他方法,这些方法适用于更简单的 HTML 页面,但不适用于 Google 组。
谢谢
这是我尝试访问的菜单的屏幕截图。 Actions popup menu (img)
点击 'Actions' 菜单按钮获取悬停菜单前后。
之前
<div tabindex="0" role="button" class="IVILX2C-n-a jfk-button-standard IVILX2C-k-c" aria-haspopup="true" aria-controls="gwt-uid-809" aria-expanded="false" aria-disabled="false" data-title="Actions">
之后
<div tabindex="0" role="button" class="IVILX2C-n-a jfk-button-standard IVILX2C-k-c IVILX2C-n-a-selected IVILX2C-n-j" aria-haspopup="true" aria-controls="gwt-uid-809" aria-expanded="true" aria-disabled="false" data-title="Actions" aria-activedescendant="gwt-uid-819">
请注意,"gwt-uid-xxx" 值在会话之间不一致。
更新:这三行似乎可以点击 'Actions' 菜单,将鼠标悬停在 'Change delivery settings' 上,然后点击 'No email'
@driver.element(文本:'Actions').click<br>
@driver.element(文字:'Change delivery setting').hover<br>
@driver.div(class: 'popupContent', index: 1).div.div.div(text: 'No email').click
编辑:下面的代码
require 'rubygems'
require 'watir-webdriver'
require 'logger'
require 'csv'
def setup
@driver = Watir::Browser.new :chrome
# set the timeout for implicit waits
@driver.driver.manage.timeouts.implicit_wait = 5
#Create log file
if @logger.nil?
@logger = Logger.new( 'D:/Google Drive/_code/GroupsEmailSetting/ChangeDeliverySetting_log.txt',10)
@logger.level = Logger::DEBUG
@logger.datetime_format = '%Y-%m-%d %H:%M:%S%z'
end
#admin credentials
@login_user = 'someone@else.com'
@login_pwd = 'pwd!'
end
def teardown
puts "Enter to close"
a = gets.chomp
@driver.quit
@logger.close
end
def run
setup
yield
teardown
end
run do
@driver.goto "https://accounts.google.com"
element = @driver.text_field(:id => "Email")
element.send_keys(@login_user)
@driver.button(:id => "next").click
element = @driver.text_field(:id => "Passwd")
element.send_keys(@login_pwd)
@driver.button(:id => "signIn").click
@logger.info "User logged in: #{@user}"
#TEMP # find users, change email setting
@domain = 'domain.com'
@group = 'watir_table'
@user = 'someone@else.com'
@dsetting = 'No email'
@logger.info("Group & User selected: #{@group + "@" + @domain + " : " + @user}")
#END TEMP
@driver.goto "https://groups.google.com/a/domain.com/forum/#!managemembers/#{@group}/members/active"
@logger.info "Group loaded: #{@group}"
browser.span(text: 'someone@else.com').parent.parent.checkbox.click
end
这是一个非常常见的模式,如果我们有更好的方法来解决它,那就太好了。尝试这样的事情:
[email1, email2, email3].each do |email_address|
row = @driver.div(text: email_address).parent.parent
row.checkbox.click
row.div(text: 'All email').parent.parent.checkbox.click
end
browser.element(text: 'Change delivery setting').hover
browser.element(text: 'No email').click